هر آنچه که باید از Redis بدونیم (۱)

Redis در مجموعه ای از چند پست ساده قصد دارم موارد اصلی دیتابیس Redis رو بنویسم.سعی می کنم در این پست ها به تفکیک فقط مواردی رو ذکر کنم که به نظر برای کار کردن با Redis ضروری میاد و شما قطعا بعد از خواندن آنها می توانید شناخت خوبی از Redis به دست بیاورید و با آن کار کنید.مطمئنا Redis در چند سال اخیر یکی از پرکاربرد ترین تکنولوژی ها بوده و داخل کشور ما هم اگر نگیم تمام پروژه های بزرگ ولی در اکثر آن ها مورد استفاده قرار گرفته است.با توجه به ویژگی های خوبی که Redis ارائه می دهد در کنار سادگی و performance بالایی که دارد به یک ابزار کار راه انداز برای کاربرد های مختلف تبدیل شده است و همیشه یکی از گزینه های روی میز برای اجرای feature های جدید پروژه ها هست، پس یادگیری اون یکی از مهم ترین نکات رزومه هر برنامه نویس سمت سرور می تواند باشد.شما بعد از خواندن مجموعه پست های Redis موارد زیر را یاد خواهید گرفت:آشنایی با Redis و موارد کاربرد آننصب و راه اندازی Redis و معرفی رابط های برنامه نویسی اون در زبان های مختلفاستفاده از Redis-cli پیکربندی Redisمقایسه Redis با Memcachedآشنایی با Data Type های اصلی Redisتمرین دستورات مهم هر کدام از Data Type های Redisبررسی نکات پیشرفته تر در Redisپیاده سازی آمار بازدید کاربران در ‌ Redis و Laravelدر ادامه این پست به ۵ مورد ابتدایی از این لیست می پردازیم.خوب Redis دقیقا چیست؟در واقع Redis یک ذخیره ساز ساختار های داده ای در RAM هست:) یعنی چی؟ساختار های داده ای یا Data Structure می توانند یک رشته ساده و یا یک لیستی از داده ها باشند که Redis اونها رو توی RAM برای ما نگه داری می کنه و می تونیم با سرعت بالا اون ها رو بازیابی کنیم. از آنجایی که داده ها رو ذخیره و بازیابی می کند یک نوع دیتابیس هست و چون توی RAM نگه می داره اصطلاحا in-memory Database نام گزاری می شود. اما برای هر داده ای که در Redis ذخیره می کنیم یک key یا کلید داریم و زمان بازیابی با استفاده از این key هست که به داده خودمون که همان value هست می رسیم و بنابر این Redis یک key value database هست.پس Redis یک دیتابیس NoSql می باشد اما علاوه بر استفاده از Redis به عنوان دیتا بیس با توجه به ویژگی های اون که در ادامه پست ها با اونها کامل آشنا می شویم می توانیم Redis رو به عنوان Cache و Message Broker هم استفاده کنیم.آیا نگه داری داده ها در RAM باعث از دست رفتن آنها نمی شود؟خوب این سوالی هست که هر تازه کاری باید در ابتدا بپرسه! آیا از آنجایی که Redis داده ها را روی RAM نگه می دارد، بعد از خاموش و روشن شدن و یا هر اتفاق غیر قابل پیش بینی که بیافتد و RAM سیستم خالی شود داده های ما پاک می شوند؟ خیر، Redis برای نگه داری دائمی داده ها آنها را با توجه به تنظیماتی که ما برای آن مشخص می کنیم به دیسک اصلی سیستم منتقل می کند و بعد از پاک شدن RAM دوباره می تواند آنها را منتقل کند و کار را از سر بگیرد.این ویژگی باعث شده اصطلاحا به آن on-disk persistence بگویند و این کار را می تواند در سطوح مختلفی انجام دهد. این سطوح شامل موارد زیر می شوند:۱. روش RDB: اگر قصد back up گیری از داده های خود به صورت فایل های جداگانه در فاصله های زمانی مشخص و بعد از تعداد مشخصی تغییر را داشته باشید می توانید از این روش استفاده کنید و کافی است به Redis بگویید که در چه بازه های زمانی به صورت تکراری و تا چه مدت از داده ها back up بگیرد. برای مثال هر ۳۰ دقیقه و به مدت ۳۰ روز از داده ها ی خود می توانید back up بگیرید و در هر زمان که مشکلی پیش آمد آنها را برگردانید. در واقع RDB مخفف Redis Database Backup می باشد به این معنی که هر بار از کل دیتا بیس یک dump می گیرد و نگه می دارد.پس در این روش ممکن هست داده هایی رو از دست بدهید و اگر در لحظه داده های شما مهم هستند بهتر هست از روش بعدی استفاده کنید.۲. روش AOF: این روش مخفف Append Only File هست به معنی اینکه یک بار فایل RDB را می سازد و با هر تغییر می تواند به آن فایل اضافه کند و به این صورت اگر چه شاید کمی کند تر باشد ولی برای داده های حساس تر گزینه بهتری هست.این روش قادر است با استفاده از fsync بعد از هر بار درج و یا تغییر یک key جدید در Redis آن را ذخیره کند.۳. غیر فعال کردن Persistence Mode به طور کلی و back up نگرفتن۴. استفاده ترکیبی از RDB و AOFنصب Redisاز آنجایی که Redis برروی اکثر سیستم های عامل نصب خواهد شد، می توانید با توجه به نوع سیستم عاملی که استفاده می کنید اقدام به دانلود و نصب آخرین نسخه آن کنید.هم اکنون نسخه 5.0.4 آن قابل نصب هست.نصب نسخه ی stable آن در ubuntu:$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz $ tar xzf redis-5.0.4.tar.gz $ cd redis-5.0.4 $ makeهم چنین شما می تونید از طریق apt هم به سادگی آن را نصب کنید و فقط باید بررسی کنید که کدام ورژن از Redis برای شما نصب خواهد شد:$ sudo apt install redis-serverاستفاده از Client برای زبان های مختلفهمان طور که در این لینک می توانید مشاهده کنید تقریبا برای تمامی زبان های مهم برنامه نویسی که در دنیا رایج هستند Client استفاده از Redis نوشته شده است.برای مثال در زبان PHP تعداد زیادی Redis Client وجود دارد که معروف ترین اونها phpredis و Predis هست.بنا براین شما با هر زبان برنامه نویسی در حال کد زدن هستید به راحتی می توانید به دیتا بیس Redis خود متصل شوید و دستورات خودتون رو اجرا نمایید.ورود به Redis Cli و بررسی وضعیت سرویس Redisبعد از نصب Redis و برای اطمینان از نصب موفق و بالا بودن سرویس می توانید با زدن دستور زیر به redis cli وارد شوید و آن را بررسی نمایید:$ redis-cliبعد از اجرای دستور بالا به محیط اجرای دستورات redis وارد می شوید و برای بررسی شرایط می توانید ping را تایپ کرده و اجرا نمایید و در جواب pong بر بگیرید:127.0.0.1:6379> ping PONGفایل پیکربندی Redis بعد از نصب برای پیکربندی ‌Redis می توانید به سراغ فایل redis.conf بروید که اگر از سیستم عامل ubuntu استفاده می کنید در آدرس etc/redis/redis.conf/ می توانید آن را پیدا کنید.شما از طریق اعمال تغییرات در این فایل و یا دستورات command line می توانید تمامی تنظیمات Redis از جمله پورت مورد استفاده آدرس bind شدهانتخاب روش persistence که در بالا خواندیم و هر نوع تنظیم دیگری را انجام دهید.برای مثال برای فعال کردن AOF می توانید مقدار appendonly را در فایل خود به yes تغییر دهید:appendonly no # The name of the append only file (default: "appendonly.aof") appendfilename "appendonly.aof"فقط باید دقت کنید که اگر تا به حال از RDB استفاده می کردید و appendonly رو فعال کنید و بروید روی AOF و بعد Redis رو ریستارت کنید نمی تواند فایل رو پیدا کند و داده های شما رو sync نمی کند.همین کار رو از طریق cli هم می توانید انجام دهید:config set appendonly yesبه صورت پیش فرض Redis از RDB استفاده می کند و مقادیر زیر در فایل config وجود دارد که می گوید هر چند وقت و با چند تغییر اقدام به back up گیری کند:save 900 1 save 300 10 save 60 10000می توانید این مقادیر پیش فرض رو در فایل config خود پیدا کنید و تغییر دهید که در اینجا مشخص هست که باید بعد از گذشت ۹۰۰ ثانیه یعنی معادل ۱۵ دقیقه اگر ۱ تغییر انجام شده بود back up بگیرد و همین طور ۲ مورد پایین تر آن که در سریع ترین حالت یعنی هر ۱ دقیقه اگر ۱۰۰۰۰ تغییر داشتیم back up بگیر.مقایسه memcached و redisاز آنجایی که هر دوی این ها برای موارد مشترکی مانند cache می توانند استفاده شود همواره مقایسه ای بین آنها انجام می شود اما با توجه به تغییرات Redis در ورژن های بالاتر تقریبا انتخاب Redis امری بدیهی هست.در پارامتر های زیادی از جنبه های مختلف می توان این دو رو بررسی کرد اما به طور خاص در این ۳ پارامتر که در ادامه اشاره می شود Redis کاملا برتر هست:تفاوت بزرگ آنها در نوع داده هایی هست که نگه می دارند. memcached فقط توانایی ذخیره نوع ساده رشته را به عنوان مقدار دارد در صورتی که Redis دارای ۵ نوع Data Type اصلی هست که در پست بعدی با آنها آشنا خواهیم شد. از آنجایی که Redis دارای Data Type های بیشتری هست استفاده از آن می تواند باعث سهولت در نگه داری ساختار های داده ای پیچیده تر و کاربرد های متفاوت تری بشود.تفاوت بعدی در بحث Memory usage هست که Redis عملکرد بهتری داد به خصوص در بحث آزاد سازی سریع فضای RAM استفاده شده بعد از flush کردن داده ها.مورد بعدی persistence هست که همان طور که در بالا دیدیم Redis به صورت پیش فرض در خودش مکانیزم های کاملی برای آن دارد در صورتی که Memcached نیاز به ابزار های 3rd party برای dump گرفتن داده ها دارد.البته ناگفته نماند که در بعضی موارد هم مانند سرعت خواندن و نوشتن و یا Scaling این دو بسیار به هم نزدیک هستند و برتری خاصی حس نمی شود.چند مورد بیشتر در مورد Redis که باید بدانیم:با زبان C نوشته شده استاز Lua Scripting پشتیبانی می کندبه صورت پیش فرض replication دارددارای partitioning از طریق Redis Cluster هستپورت پیش فرض اون 6379 هستبه صورت open source و تحت License BSD نگه داری می شودخوب در این پست با مفاهیم اصلی و ابتدایی Redis آشنا شدیم و در پست بعدی می رویم سراغ معرفی Data Type ها و استفاده عملی از Redis .هر آنچه که باید از Redis بدونیم (۲)اگر این پست برای شما مفید بود لایک یادتون نره :)