مقدمه
برای نگهداری موقت دادهها بر روی حافظهی پر سرعتی مانند Memory میتوانیم از ابزاری به نام redis استفاده کنیم. شاید این نگرانی را داشته باشید که دادههای موجود در Memory با Reset شدن سیستم عامل از بین خواهند رفت، اما نگران نباشید! چرا که redis این امکان را فراهم میکند که یک نسخه backup از دادهها بر روی دیسک هم داشته باشید(persistence) و با اینکار حتی در صورت خاموش شدن سیستم عامل هم باز اطلاعاتی که به این ابزار سپرده بودیم از بین نخواهند رفت. مسئلهی بعدی این است که اگر به هر دلیلی این ابزار نصب شده بر روی سیستم عامل از کار بیوفتد، چگونه اپلیکیشن ما به حیات خود ادامه خواهد داد؟
در این مورد هم نگرانی خاصی نخواهیم داشت زیرا redis به راحتی میتواند تکثیر شود(replication) و این نمونههای تکثیر شده با هم مرتبط شوند و مجموعهای با قابلیت اطمینان و دسترسی بالا(high availability) ایجاد نماید. همچنین اگر ارتباط بخش خاصی از این مجموعه با سایر اجزا قطع شود، پس از رفع مشکل، این ارتباط دوباره بصورت خودکار برقرار میشود. همهی این امکانات دست به دست هم میدهند تا امکانی را برای ما فراهم کنند که اطلاعات را به طور موقت(cache) نگهداری کند.
[divider]
کاربرد
در مقدمه به برخی از مزیتهای redis اشاره شد. حال باید ببینیم که این پایگاه اطلاعات موقت به چه دردی میخورد؟ برای پاسخ به این سوال مثالی بیان میکنم تا بصورت عملی ارزشی که این ابزار برای ما ایجاد میکند را درک کنیم. فرض کنید اپلیکیشنشما یک جستجوگر وب باشد و کاربران هر روز و هر لحظه عملیات جستجو را بر روی جستجوگر شما انجام میدهند. نتایجی که هر بار به کاربران نمایش میدهید در بسیاری از موارد تکراری هستند. یعنی اگر یک روز نرخ ارز خبر جنجالی باشد کلیدواژههای مرتبط با این خبر معمولا بیشترین تکرار را دارند و جستجوگر شما برای پاسخگویی هر بار کارهای تکراری انجام میدهد. در این وضعیت redis به شما کمک میکند تا بجای هر بار محاسبه جواب، برای هر کلید واژه، یک بار عملیات جستجو را انجام دهید و نتیجه را در حافظه موقت ذخیره کنید. با اینکار سایر کاربرانی که همین کلیدواژه را جستجو میکنند همان جواب قبلی را این بار از روی redis میخوانند. با اینکار بار پردازش بر روی جستجوگر شما کاهش پیدا میکند و کاربران زودتر میتوانند پاسخ مورد نیاز خود را دریافت کنند. گوگل نمونهای از این ترفند برای بالابردن سرعت جستجو است. شما با وارد کردن کلیدواژه مورد نظر در کسری از ثانیه با میلیونها نتیجه روبرو میشوید که پردازش چنین نتیجهای قطعا زمانی طولانیتر از آن چیزی که ما حس میکنیم نیاز دارد.
مثالی دیگر از کاربرد redis به این صورت است که فرض کنید شما یک شبکه اجتماعی با تعداد زیادی کاربر دارید. در میان این کاربران ممکن است بازیگران و افراد مشهور جامعه حضور داشته باشند. طبیعی است که بازدید حساب کاربری این افراد به نسبت سایر کاربران بیشتر است. برای بارگذاری تصویر پروفایل این کاربران اگر بخواهیم هر بار تصویر را از روی دیسک سرور بخوانیم ترافیک بسیار زیادی بر روی دیسک سرور اعمال خواهد شد که علاوه بر کندی باعث کم شدن طول عمر هارد دیسک سرور میشود. میتوانیم تصایر پروفایل اینگونه افراد را در داخل redis قرار دهیم(cache) و با اینکار سرعت بارگذاری پروفایلها و فشار وارد بر هارد دیسک سرور را کاهش دهیم.
[divider]
نصب و راه اندازی redis
در این آموزش میخواهیم مراحل نصب redis بر روی یک ماشین با سیستم عامل ubuntu 16.04 را دنبال کنیم. مراحل را به ترتیب دنبال کنید تا با مشکل روبرو نشوید. در ابتدا باید repository های موجود در سیستم عامل را بروز رسانی کنیم تا پکیجهایی که نصب میکنیم بروز ترین نسخهها باشند. برای اینکار دستور زیر را در ترمینال وارد کنید:
sudo apt-get update
حال برای اینکه بتوانیم سورس کد redis را بر روی سیستم خود کامپایل و در نهایت نصب کنیم، باید ابزار کامپایل را بر روی سیستم خود نصب کنیم. برای اینکار دستور زیر را در ترمینال وارد کنید:
sudo apt-get install build-essential tcl
در ادامه به مسیر /tmp میرویم و سورس کد redis را دانلود میکنیم. برای اینکار دستورات زیر را وارد کنید:
cd /tmp curl -O http://download.redis.io/redis-stable.tar.gz
پس از دانلود سورس کد باید آن را از حالت فشرده خارج کنیم. اینکار با کمک دستور زیر انجام میشود:
tar xzvf redis-stable.tar.gz
حال به پوشهای که پس از استخراج از حالت فشرده ایجاد شد رفته و سورس کد را کامپایل میکنیم:
cd redis-stable make make test
اجرای دستورات بالا ممکن است اندکی زمان بر باشد. پس از انجام عملیات کامپایل به کمک دستور زیر redis را نصب میکنیم:
sudo make install
[divider]
پیکرهبندی redis
پس از نصب redis باید تنظیمات مورد نیازمان را بر روی آن اعمال کنیم. برای اینکار ابتدا مسیر نگهداری فایل تنظیمات را میسازیم و سپس فایل نمونه تنظیمات را به آن کپی میکنیم:
sudo mkdir /etc/redis sudo cp /tmp/redis-stable/redis.conf /etc/redis
حال باید فایل نمونه تنظیماتی که به مسیر تنظیمات منتقل کردیم را ویرایش کرده و تغییرات لازم را در آن ایجاد کنیم:
sudo nano /etc/redis/redis.conf
در میان تنظیمات دنبال عبارت supervised بگردید و آن خط را به مقدار زیر تغییر دهید:
supervised systemd
عبارت دیگری که باید تغییر کند dir است. این قسمت تعیین کننده محل نگهداری اطلاعات موقت بر روس دیسک است و زمانی مورد استفاده قرار میگیرد که بخواهیم یک نسخه از اطلاعات موقت بر روی دیسک هم نگهداری شود تا در صورت خاموش شدن سیستم اطلاعات موقت از بین نروند.
خطی که dir در آن نوشته شده را به مقدار زیر تغییر دهید:
dir /var/lib/redis
[divider]
ایجاد سرویس سیستمی برای redis
عنوانی که برای این بخش آموزش استفاده شده شاید زیاد مفهوم به نظر نرسد. کاری که در این بخش میخواهیم انجام بدهیم ایجاد فایلی برای راهاندازی(start)، ریست و توقف(stop) برای redis است. همچنین به کمک این فایل قادر خواهیم بود تا redis را با هر بار راهاندازی سیستم عامل بصورت خودکار اجرا کنیم. دیگر مزیت این فایل امکان راهاندازی مجدد redis پس از توقف ناگهانی(بر اثر خطا) است. برای ایجاد این فایل دستورات زیر را در ترمینال وارد کنید:
sudo nano /etc/systemd/system/redis.service
داخل این فایل محتویات زیر را قرار دهید:
[Unit] Description=Redis In-Memory Data Store After=network.target [Service] User=redis Group=redis ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli shutdown Restart=always [Install] WantedBy=multi-user.target
در میان محتویات بالا بخشی که باید به آن توجه کنید عبارات User و Group هستند. این دو تعیین کننده سطح کاربریای هستند که سرویس redis با دسترسی آنها اجرا خواهد شد. این کاربر باید به پوشههایی که مورد استفاده redis هستند دسترسی کامل داشته باشد. برای امنیت بیشتر بهتر است این کاربر، کاربر اصلی سیستم عامل نباشد. برای تحقق این مورد امنیتی به کمک دستور زیر کاربر مورد نیاز را بسازید:
sudo adduser --system --group --no-create-home redis
حال باید دارکتوریای که در فایل تنظیمات برای dir تعیین کردیم را بسازیم و مالکیت آن را به کاربری که ساختیم بدهیم. همچنین امکان read و write و execute نیز باید به کاربر و گروه مورد نظر داده شود. این کار با دستورات زیر انجام میشود:
sudo mkdir /var/lib/redis sudo chown redis:redis /var/lib/redis sudo chmod 770 /var/lib/redis
خوشبختانه تمام کارهایی که برای راه اندازی سرویس نیاز داشتیم، انجام شد. حال با کمک دستور زیر سرویسمان را راهاندازی میکنیم:
sudo systemctl start redis
پس از اجرای دستور بالا، برای اطمینان از صحت عملکرد سرویس میتوانیم با کمک دستور زیر وضعیت سرویس را مشاهده کنیم:
sudo systemctl status redis
برای اینکه با هر بار بوت شدن سیستم سرویس ما به طور خودکار راهاندازی شود، باید این سرویس را enable کنید. این کار با دستور زیر انجام میشود:
sudo systemctl enable redis
[divider]
تست redis
پس از نصب و پیکرهبندی، نوبت به استفاده از این ابزار میرسد. فعلا استفاده ما در حد یک تست ساده است که مطمئن شویم این سرویس به درستی کار میکند. برای تست وارد ترمینال شوید و دستور زیر را وارد کنید:
redis-cli
سپس عبارت ping را تایپ کرده و کلید enter را بزنید. در جواب باید عبارت PONG دریافت کنید. این بیانگر صحت و سلامت سرویس است.
تست بعدی set کردن یک متن و get کردن مقدار آن است. اگر از redis خارج نشدهاید، برای set کردن دستور زیر را وارد کنید:
set test "salam"
در جواب دستور بالا عبارت OK را خواهید دید. در دستور بالا test کلیدی است که در آن مقدار(value) مورد نظر ما که عبارت “salam” است، ذخیره شده است. حال برای get کردن این مقدار کافیست دستور زیر را وارد کنیم:
get test
جواب دستور بالا عبارت “salam” خواهد بود که پیشتر set کرده بودیم. برای خروج از محیط redis دستور exit را تایپ کرده و Enterرا بزنید.
حال اگر سرویس را restart کنید و دوباره مقدار کلید test را get کنید بازهم “salam” نمایان خواهد شد. برای restart کردن سرویس دستور زیر را در ترمینال تایپ کنید:
sudo systemctl restart redis
موفق و پیروز باشید…