آموزشآموزش‌های تکی

آموزش تکی، حدود ۳۲ دقیقه خواندن

ردیس چیه

جواب کوتاه

ردیس (Redis، کوتاه‌شده‌ی REmote DIctionary Server، یعنی «سرور فرهنگ لغت از راه دور») یه انبار داده‌ست که همه‌چیز رو توی رم نگه می‌داره، برای همین هر خوندن و نوشتنش کسری از میلی‌ثانیه طول می‌کشه. داده رو با کلید و مقدار نگه می‌داره و بیشتر برای کش، نشست کاربرها، صف کارها و شمارنده‌ها استفاده می‌شه؛ رایج‌ترین ابزار کش برای سایت‌ها و وردپرس هم همینه.

اسم

Redis کوتاه‌شده‌ی REmote DIctionary Server هست. Dictionary یعنی «فرهنگ لغت»؛ یه کلمه، و معنیش جلوش. ردیس هم همین‌طوری کار می‌کنه: یه اسم (کلید) و یه چیزی که پشتش نگه داشته شده (مقدار). Remote Server هم یعنی «سروری که از راه دور بهش وصل می‌شید»؛ یعنی برنامه‌های دیگه از راه شبکه یا از روی همون سرور باهاش حرف می‌زنن.

پس ردیس یه برنامه‌ست که کنار سایت شما روی سرور اجرا می‌شه، و سایت ازش می‌خواد چیزهایی رو براش نگه داره و هر وقت لازم شد، خیلی سریع پس بده.

چرا ساخته شد

دیتابیس‌های معمولی، مثل همونی که وردپرس استفاده می‌کنه، داده رو روی دیسک نگه می‌دارن و برای هر سوال، کلی کار انجام می‌دن؛ جدول‌ها رو می‌گردن، به هم وصل می‌کنن، مرتب می‌کنن. این‌ها برای نگه داشتن مطمئن داده عالی‌ان، ولی برای کارهای خیلی کوچیک و خیلی پرتکرار، سنگین‌ان.

ردیس سال ۲۰۰۹ برای همین ساخته شد. سازنده‌ش یه برنامه‌نویس بود که یه ابزار آمار لحظه‌ای سایت ساخته بود، و دیتابیس معمولی زیر بار نوشتن‌های پشت سر هم کم آورده بود. خودش یه انبار ساده توی رم ساخت که فقط کلید و مقدار نگه داره و فوق‌العاده سریع باشه. بعد کدش رو آزاد منتشر کرد، و ظرف چند سال تقریبا هر سایت بزرگی ازش استفاده می‌کرد.

جیب پیراهن

مثلا فرض کنید یه کمد بزرگ دارید که همه‌ی وسایلتون توشه. ولی چیزهایی که هر دقیقه لازم دارید، مثل کلید و خودکار، رو توی جیب پیراهنتون می‌ذارید. چرا؟ چون هر بار رفتن تا کمد، وقت می‌گیره.

دیتابیس، کمد سروره؛ همه‌چیز توشه، مرتب و مطمئن. ردیس، جیب پیراهنه؛ کوچیک‌تره، ولی هر چیزی توشه همون لحظه دم دسته. و مثل جیب، جاش محدوده؛ نمی‌شه کل کمد رو توش جا داد. پس باید انتخاب کنید چی توی جیب بره. همین فکر، پشت همه‌ی کاربردهای ردیسه.

توی رم یعنی چی

توی درس رم دیدید که رم میز کار کامپیوتره؛ هر چیزی روش باشه، پردازنده همون لحظه بهش می‌رسه، ولی با خاموش شدن، میز خالی می‌شه. دیسک، حتی NVMe، هنوز چند صد برابر از رم کندتره.

ردیس همه‌ی داده‌ش رو روی همین میز نگه می‌داره. برای همین یه خوندن یا نوشتن ساده توی ردیس، کسری از میلی‌ثانیه طول می‌کشه، و یه ردیس معمولی روی یه سرور معمولی، صدها هزار دستور در ثانیه رو جواب می‌ده. دو تا پیامد هم داره: اول اینکه جاش به اندازه‌ی رم محدوده، و دوم اینکه اگه کاری نکنید، با خاموش شدن سرور داده‌ش می‌پره. هر دو رو جلوتر حل می‌کنیم.

کلید و مقدار

توی ردیس جدول و ستون نیست. هر چیزی یه کلید داره، یعنی یه اسم، و یه مقدار. مثلا کلید «user:42:name» و مقدار «سارا». یا کلید «visits:today» و مقدار «۱۲۵۰۰». برای پیدا کردن هر چیزی، فقط اسمش رو می‌دید.

اسم کلیدها رو معمولا با دو نقطه تیکه‌تیکه می‌کنن، مثل همون «user:42:name»، تا مرتب بمونن و بشه فهمید هر کدوم مال چیه. ردیس خودش به این دو نقطه‌ها اهمیتی نمی‌ده؛ فقط یه قرار بین برنامه‌نویس‌هاست. یه سرور ردیس می‌تونه میلیون‌ها کلید رو نگه داره.

اولین دستورها

ردیس با دستورهای کوتاه کار می‌کنه. این پنج تا رو که بدونید، اصل کار رو فهمیدید:

  1. با SET name sara مقدار «sara» رو زیر کلید name می‌ذارید.
  2. با GET name همون رو پس می‌گیرید.
  3. با EXPIRE name 60 می‌گید این کلید ۶۰ ثانیه دیگه خودش پاک بشه.
  4. با INCR visits یه عدد رو یکی زیاد می‌کنید، حتی اگه هزار نفر هم‌زمان این کار رو بکنن.
  5. و با DEL name کلید رو پاک می‌کنید.

برای امتحان، روی سروری که ردیس داره، برنامه‌ی redis-cli رو باز کنید و همین‌ها رو بزنید. ولی یه دستور رو هیچ‌وقت روی سرور واقعی نزنید: KEYS *، که همه‌ی کلیدها رو فهرست می‌کنه. روی ردیسی با میلیون‌ها کلید، ردیس رو چند ثانیه قفل می‌کنه. برای گشتن بین کلیدها، دستور SCAN هست که تیکه‌تیکه می‌گرده.

شکل‌های مقدار

چیزی که ردیس رو از یه کش ساده جدا می‌کنه، اینه که مقدار فقط یه متن ساده نیست. ردیس چند تا شکل داده رو خودش می‌شناسه، و برای هر کدوم دستورهای خودش رو داره.

  • رشته (string)
  • فهرست (list)
  • مجموعه (set)
  • مجموعه‌ی مرتب
  • هش (hash)
  • جریان (stream)

ساده‌ترینش رشته‌ست، یه تیکه متن یا عدد، که کش و شمارنده با همین ساخته می‌شه. فهرست یه صف مرتبه که می‌شه از سر یا تهش چیز اضافه یا برداشت کرد؛ برای صف کارها عالیه. مجموعه یه کیسه از چیزهای بی‌تکراره؛ مثلا فهرست کسایی که امروز اومدن، که هر کس فقط یه بار توش هست. مجموعه‌ی مرتب همون کیسه‌ست ولی هر عضو یه امتیاز داره و همیشه به ترتیب امتیاز مرتبه؛ جدول رتبه‌بندی یه بازی با یه دستور ساخته می‌شه.

هش مثل یه کارت با چند تا خونه‌ست؛ زیر یه کلید، چند تا اسم و مقدار، مثلا نام و شهر و سن یه کاربر، که می‌شه هر خونه رو جدا خوند و عوض کرد. جریان (stream) یه دفتر روزانه‌ست که هر خط یه زمان داره و فقط به تهش اضافه می‌شه؛ برای ثبت رویدادها و پیام‌هایی که چند برنامه باید بخونن. چند تا شکل خاص‌تر هم هست، مثل شمردن تقریبی بازدیدکننده‌های یکتا با رم خیلی کم، یا نگه داشتن مختصات جغرافیایی و پیدا کردن نزدیک‌ترین‌ها.

انقضا

هر کلید توی ردیس می‌تونه یه تاریخ انقضا داشته باشه. وقتی وقتش برسه، ردیس خودش اون رو پاک می‌کنه. این برای کش خیلی مهمه؛ «این جواب رو ده دقیقه نگه دار، بعد خودت دورش بنداز». برای کد تاییدی که پیامک می‌شه هم عالیه؛ «این کد دو دقیقه معتبره».

ردیس کلیدهای منقضی‌شده رو دو جور پاک می‌کنه. یکی وقتی کسی سراغشون میاد؛ می‌بینه وقتش گذشته و همون موقع پاکش می‌کنه. یکی هم پشت صحنه، چند بار در ثانیه، یه مشت کلید تصادفی رو نگاه می‌کنه و منقضی‌ها رو برمی‌داره. برای همین کلید منقضی‌شده ممکنه چند لحظه رم بگیره، ولی هیچ‌وقت به کسی داده نمی‌شه.

جیب پر

اگه چیزی جلوی ردیس رو نگیره، هر چی بهش بدید نگه می‌داره، تا رم سرور تموم بشه و سیستم‌عامل یه برنامه رو، شاید خود ردیس یا دیتابیس، به زور ببنده. برای همین اولین تنظیم هر ردیس، maxmemory‌ئه؛ سقف رمی که ردیس حق داره بگیره.

تنظیم دوم اینه که وقتی به سقف رسید، چی کار کنه؛ بهش می‌گن maxmemory-policy. حالت پیش‌فرض noeviction‌ئه، یعنی «هیچی بیرون ننداز، نوشتن تازه رو رد کن». این برای وقتیه که ردیس داده‌ی مهم نگه می‌داره. برای کش، باید یکی از حالت‌های بیرون انداختن رو انتخاب کنید. allkeys-lru از بین همه‌ی کلیدها، اونی رو که از همه دیرتر استفاده شده بیرون می‌اندازه؛ LRU کوتاه‌شده‌ی Least Recently Used. allkeys-lfu اونی رو که از همه کمتر استفاده شده؛ LFU کوتاه‌شده‌ی Least Frequently Used. حالت‌های volatile هم فقط از بین کلیدهایی انتخاب می‌کنن که انقضا دارن.

برای کش یه سایت، allkeys-lru یا allkeys-lfu تقریبا همیشه انتخاب درسته. ردیس برای سرعت، دقیق نمی‌گرده کدوم کلید از همه قدیمی‌تره؛ چند تا کلید تصادفی برمی‌داره و قدیمی‌ترین‌شون رو بیرون می‌اندازه، که در عمل تقریبا همون نتیجه رو می‌ده.

بعد از قطع برق

ردیس داده رو توی رم نگه می‌داره، ولی می‌تونه یه نسخه هم روی دیسک بذاره تا بعد از روشن شدن دوباره، همه‌چیز برگرده. دو تا راه داره:

RDB: عکس کامل از کل حافظه، گاه‌به‌گاه.
AOF: دفتر روزانه‌ی همه‌ی دستورها.

راه اول RDB‌ئه، کوتاه‌شده‌ی Redis Database؛ هر چند وقت یه بار، یه عکس کامل از کل حافظه می‌گیره و توی یه فایل می‌ذاره. فایلش فشرده‌ست و برگردوندنش سریع، ولی اگه برق بین دو تا عکس بره، تغییرهای اون فاصله از دست می‌ره. راه دوم AOF‌ئه، کوتاه‌شده‌ی Append Only File، یعنی «فایلی که فقط به تهش اضافه می‌شه»؛ هر دستوری که چیزی رو عوض کنه، یه خط توی این دفتر نوشته می‌شه. معمولا ردیس هر ثانیه یه بار این دفتر رو قطعی روی دیسک می‌نویسه، پس بیشترین چیزی که از دست می‌ره، یه ثانیه‌ست.

می‌شه هر دو رو با هم روشن کرد، یا هیچ‌کدوم. برای کش خالص، که هر چی توشه از دیتابیس دوباره ساخته می‌شه، خیلی‌ها ذخیره روی دیسک رو کامل خاموش می‌کنن؛ کش بعد از روشن شدن سرد می‌شه، ولی هیچ داده‌ای از دست نمی‌ره. برای نشست کاربرها و صف کارها، که ساختن دوباره‌شون ممکن نیست، دست‌کم AOF لازمه.

یه صندوق‌دار

یه چیز عجیب درباره‌ی ردیس: دستورها رو با یه رشته، یعنی عملا با یه هسته‌ی پردازنده، و یکی‌یکی اجرا می‌کنه. مثل فروشگاهی که فقط یه صندوق‌دار داره.

پس چطور این‌قدر سریعه؟ چون هر دستور فقط کار با رمه و کسری از میکروثانیه طول می‌کشه، صندوق‌دار هیچ‌وقت معطل نیست. و چون فقط یه نفره، لازم نیست با کسی سر یه چیز دعوا کنه یا منتظر قفل بمونه. یه فایده‌ی بزرگ هم داره: هر دستور «یه‌تیکه» اجرا می‌شه؛ وقتی هزار نفر هم‌زمان INCR می‌زنن، عدد دقیقا هزار تا زیاد می‌شه، نه کمتر.

عیبش اینه که یه دستور کند، همه رو معطل می‌کنه؛ همون KEYS * که گفتیم، یا پاک کردن یه کلید خیلی بزرگ. نسخه‌های جدیدتر ردیس کارهای جانبی، مثل خوندن و نوشتن روی شبکه و پاک کردن کلیدهای بزرگ، رو به رشته‌های دیگه سپردن، ولی اجرای خود دستورها هنوز یکی‌یکیه.

چند دستور با هم

خیلی وقت‌ها کندی ردیس از خود ردیس نیست، از رفت و برگشت‌های شبکه‌ست. اگه برنامه هزار تا دستور رو یکی‌یکی بفرسته و هر بار منتظر جواب بمونه، هزار بار رفت و برگشت داره. pipelining، یعنی «لوله‌کشی»، یعنی هر هزار تا رو پشت سر هم بفرستید و جواب‌ها رو با هم بگیرید. سرعت چند برابر می‌شه.

اگه بخواید چند تا دستور حتما با هم انجام بشن، بی اینکه دستور کس دیگه‌ای وسطشون بیاد، ردیس MULTI و EXEC داره؛ دستورها رو جمع می‌کنید و یه‌جا اجرا می‌شن. برای کارهای پیچیده‌تر هم می‌شه یه تیکه برنامه‌ی کوچیک به زبان Lua فرستاد که روی خود ردیس، یه‌تیکه، اجرا بشه.

به چه دردی می‌خوره

رایج‌ترین کاربرد ردیس، کشه؛ جواب سوال‌های سنگین دیتابیس، صفحه‌های آماده یا تیکه‌هاشون، که با یه کلید نگه داشته می‌شن تا دفعه‌ی بعد دوباره ساخته نشن. آبجکت کش وردپرس دقیقا همینه.

کاربرد دوم، نشست کاربرهاست؛ اینکه کی وارد شده و سبد خریدش چیه. وقتی سایت روی چند سرور کار می‌کنه، همه باید نشست‌ها رو از یه جا بخونن، و ردیس اون جای مشترکه. کاربرد سوم، صف کارهاست؛ مثلا «این ایمیل رو بفرست» یا «این عکس رو کوچیک کن» توی یه فهرست ردیس می‌ره، و یه برنامه‌ی دیگه یکی‌یکی برشون می‌داره و انجامشون می‌ده، بی اینکه کاربر منتظر بمونه.

کاربرد چهارم، شمارنده‌ها و محدودیت‌هاست. «این آدرس توی یه دقیقه چند بار فرم ورود رو زده؟» با INCR و EXPIRE ساخته می‌شه، و اگه از یه حد گذشت، جلوش گرفته می‌شه. این همون چیزیه که جلوی حدس زدن رمز با زور رو می‌گیره. کاربرد پنجم، رتبه‌بندی‌هاست، با مجموعه‌ی مرتب؛ پرفروش‌ترین محصول‌ها، پربازدیدترین نوشته‌ها، بالاترین امتیازها.

پیام‌رسان کوچیک

ردیس یه امکان دیگه هم داره به اسم انتشار و اشتراک (publish و subscribe). یه برنامه روی یه «کانال» پیام می‌فرسته، و هر برنامه‌ای که به اون کانال گوش می‌ده، همون لحظه پیام رو می‌گیره. مثل بلندگوی یه ساختمون؛ هر کی توی اتاقه می‌شنوه، هر کی نیست نمی‌شنوه.

این برای کارهایی مثل «به همه‌ی سرورها بگو کش فلان صفحه رو پاک کنن» یا «به همه‌ی پنجره‌های چت بگو پیام تازه اومده» به درد می‌خوره. ولی پیام‌ها جایی نگه داشته نمی‌شن؛ اگه کسی اون لحظه گوش نمی‌داده، پیام رو از دست داده. برای پیامی که نباید گم بشه، جریان (stream) بهتره، که هر پیام رو نگه می‌داره تا خونده بشه.

کپی و نگهبان

اگه ردیس فقط کش باشه و خراب بشه، سایت کند می‌شه ولی کار می‌کنه. ولی اگه نشست‌ها یا صف‌ها توش باشن، خراب شدنش یعنی خوابیدن سایت. برای همین ردیس می‌تونه کپی داشته باشه.

یه ردیس اصلیه و همه‌ی نوشتن‌ها بهش می‌رسه، و یه یا چند تا ردیس کپی، هر تغییری رو تقریبا همون لحظه از اصلی می‌گیرن. خوندن‌ها رو می‌شه بین کپی‌ها پخش کرد. اگه اصلی خراب بشه، یکی از کپی‌ها می‌تونه جاش بشینه.

ولی کی تصمیم بگیره؟ اینجا Sentinel، یعنی «نگهبان»، میاد. چند تا برنامه‌ی نگهبان مدام ردیس‌ها رو نگاه می‌کنن، و اگه بیشترشون قبول داشته باشن که اصلی از دست رفته، یکی از کپی‌ها رو اصلی می‌کنن و به برنامه‌ها خبر می‌دن که از این به بعد به کجا وصل بشن. چند تا نگهبان، و نه یکی، برای اینه که یه نگهبان که خودش قطع شده، به اشتباه همه‌چیز رو به هم نریزه.

چند سرور با هم

وقتی داده از رم یه سرور بزرگ‌تر بشه، یا کار از یه هسته بیشتر، ردیس Cluster به کار میاد. کلیدها بین چند تا ردیس پخش می‌شن؛ ردیس کل فضای کلیدها رو به ۱۶۳۸۴ تیکه تقسیم می‌کنه و هر سرور مسئول یه بخش از این تیکه‌هاست. هر سرور هم می‌تونه کپی خودش رو داشته باشه.

برای یه سایت معمولی، و حتی خیلی از فروشگاه‌های بزرگ، یه ردیس با یه کپی کاملا کافیه. Cluster برای وقتیه که با ده‌ها گیگابایت داده و میلیون‌ها دستور در ثانیه سر و کار دارید. پیچیدگیش هم کم نیست؛ مثلا دستوری که با چند تا کلید کار می‌کنه، فقط وقتی جواب می‌ده که همه‌ی اون کلیدها روی یه سرور باشن.

هر کلید چقدر رم

هر کلید توی ردیس، جدا از خود مقدار، یه کم رم اضافه هم می‌گیره؛ برای اسمش، برای انقضاش و برای جای خودش توی فهرست کلیدها. این اضافه برای هر کلید چند ده بایته. برای یه میلیون کلید کوچیک، همین اضافه‌ها خودشون چند ده مگابایت می‌شن.

برای همین یه ترفند رایج اینه که به‌جای هزاران کلید ریز، چیزهای مرتبط رو زیر یه هش بذارید. ردیس هش‌ها و فهرست‌های کوچیک رو به یه شکل فشرده‌ی مخصوص نگه می‌داره که خیلی کمتر رم می‌خوره. یه ترفند دیگه، کوتاه نگه داشتن اسم کلیدهاست؛ وقتی میلیون‌ها کلید دارید، هر حرف اضافه‌ی اسم، ضرب در میلیون می‌شه.

دستور MEMORY USAGE با اسم یه کلید، می‌گه اون کلید دقیقا چقدر رم گرفته. اگه رم ردیس یهو بالا رفت، معمولا چند تا کلید خیلی بزرگ مقصرن، و redis-cli با گزینه‌ی bigkeys پیداشون می‌کنه.

پشتیبان

اگه ردیس فقط کشه، پشتیبان لازم نداره. ولی اگه چیز مهمی توشه، فایل RDB بهترین پشتیبانه؛ یه فایل فشرده که هر وقت بخواید، می‌شه کپیش کرد. دستور BGSAVE ردیس رو وادار می‌کنه همین الان یه عکس تازه بگیره، بی اینکه کارش متوقف بشه.

ردیس این کار رو با یه ترفند سیستم‌عامل انجام می‌ده؛ یه کپی از خودش می‌سازه که همون لحظه رو روی دیسک بنویسه، در حالی که نسخه‌ی اصلی به کارش ادامه می‌ده. این کپی اول رم اضافه نمی‌گیره، ولی هر چی ردیس اصلی وسط کار عوض کنه، اون تیکه از رم دو نسخه می‌شه. پس اگه ردیس پرکار و بزرگ دارید، رم سرور باید برای این لحظه جا داشته باشه. پشتیبان رو هم مثل هر پشتیبان دیگه، روی سرور دیگه‌ای نگه دارید.

فراتر از کش

ردیس کم‌کم چیزهای بیشتری یاد گرفته. نسخه‌های جدیدش می‌تونن سند JSON رو مستقیم نگه دارن و یه تیکه از وسطش رو بخونن یا عوض کنن، توی داده‌ها جستجوی متنی انجام بدن، سری‌های زمانی مثل دمای هر دقیقه رو نگه دارن، و بردارهای عددی رو نگه دارن و نزدیک‌ترین‌ها رو پیدا کنن.

اون آخری برای هوش مصنوعی مهم شده. وقتی یه برنامه می‌خواد متن‌های شبیه یه سوال رو پیدا کنه، هر متن رو به یه بردار عددی تبدیل می‌کنه و ردیس نزدیک‌ترین بردارها رو در چند میلی‌ثانیه پیدا می‌کنه. این‌ها از ردیس ۸ خود ردیس شدن؛ قبلش افزونه‌های جدا بودن.

ولی برای یه سایت معمولی، هیچ‌کدوم لازم نیست. ردیس سایت شما، همون جیب پیراهنه؛ کش، نشست و چند تا شمارنده.

امنیت

ردیس برای اجرا توی یه شبکه‌ی امن ساخته شده، نه روی اینترنت باز. سال‌ها پیش، هزاران ردیس بی‌رمز روی اینترنت باز بودن، و حمله‌کننده‌ها با چند تا دستور ساده، فایل‌های خودشون رو روی سرورها می‌نوشتن و کامل سرور رو می‌گرفتن. بعد از اون، ردیس یه «حالت محافظت‌شده» اضافه کرد که اگه رمز نداشته باشه، از بیرون جواب نمی‌ده.

ردیس به‌طور پیش‌فرض روی درگاه ۶۳۷۹ گوش می‌ده. قانون اول اینه که این درگاه هیچ‌وقت روی اینترنت باز نباشه. ردیس فقط روی خود سرور گوش بده (localhost)، یا اگه روی سرور جداست، فقط روی شبکه‌ی خصوصی، و دیوار آتش هم این درگاه رو از بیرون ببنده. قانون دوم، رمز. از نسخه‌ی ۶، ردیس ACL داره، کوتاه‌شده‌ی Access Control List، یعنی «فهرست دسترسی»؛ می‌شه چند تا کاربر ساخت که هر کدوم فقط به کلیدها و دستورهای خودش دسترسی داشته باشه. قانون سوم، دستورهای خطرناک، مثل پاک کردن کل داده یا عوض کردن تنظیمات، برای کاربری که سایت باهاش وصل می‌شه بسته باشن.

و اگه ردیس روی سرور دیگه‌ایه و داده از شبکه رد می‌شه، رمز کردن ارتباط با TLS، همون قفلی که توی درس SSL می‌بینید، رو هم روشن کنید.

نصب و تنظیم

روی یه سرور لینوکس، ردیس معمولا با یه دستور از مخزن خود سیستم‌عامل نصب می‌شه. بعد از نصب، همه‌ی تنظیم‌ها توی یه فایل به اسم redis.conf هستن. این قدم‌ها برای یه ردیس امن و آماده‌ی کش کافیه:

  1. اول توی redis.conf بنویسید ردیس فقط روی 127.0.0.1 گوش بده، یا از سوکت محلی استفاده کنه.
  2. بعد یه رمز قوی بذارید، یا با ACL یه کاربر جدا برای سایت بسازید.
  3. بعد maxmemory رو بذارید، مثلا 256mb، و maxmemory-policy رو allkeys-lru.
  4. بعد تصمیم بگیرید ذخیره روی دیسک لازمه یا نه؛ برای کش خالص خاموش، برای نشست AOF.
  5. و آخر ردیس رو دوباره راه بندازید و با redis-cli و دستور PING ببینید جواب PONG می‌ده.

اگه سرور چند تا سایت داره، برای هر سایت یه پیشوند کلید جدا بذارید، یا بهتر، برای هر کدوم یه کاربر ACL که فقط به کلیدهای خودش دسترسی داره.

ردیس و وردپرس

وردپرس خودش با ردیس حرف نمی‌زنه؛ یه افزونه لازمه که فایل object-cache.php رو بذاره. بعد از اون، وردپرس جواب سوال‌های تکراری دیتابیس رو توی ردیس نگه می‌داره. سودش برای فروشگاه‌ها، کاربرهای واردشده و پیشخوان از همه بیشتره، چون اون‌جاها کش صفحه کار نمی‌کنه.

برای وردپرس روی سرور خودتون، این تنظیم‌ها کافیه: یه سقف رم (برای بیشتر سایت‌ها ۲۵۶ تا ۵۱۲ مگابایت)، allkeys-lru، ذخیره روی دیسک خاموش یا فقط RDB، گوش دادن فقط روی خود سرور یا با سوکت محلی، و یه پیشوند کلید جدا برای هر سایت. روی هاست اشتراکی معمولا یه ردیس بین صدها سایته؛ هم رمش شریکه، هم اگه یکی هک بشه، به یادداشت‌های بقیه نزدیکه.

سنجیدن

دستور INFO توی ردیس، تقریبا همه‌چیز رو می‌گه. چند تا عددش از همه مهم‌ترن. keyspace_hits و keyspace_misses تعداد برخوردها و از دست رفتن‌ها رو می‌گن؛ نرخ برخورد از این دو تا حساب می‌شه. used_memory می‌گه چقدر رم گرفته. evicted_keys می‌گه چند تا کلید به خاطر پر شدن بیرون انداخته شده. connected_clients می‌گه چند تا برنامه الان وصلن.

دستور SLOWLOG هم دستورهایی رو که بیشتر از یه حد طول کشیدن نشون می‌ده؛ اگه یه افزونه دستور سنگین می‌زنه، اینجا پیداش می‌کنید. و redis-cli با گزینه‌ی latency تاخیر رو اندازه می‌گیره. یه عدد دیگه هم هست به اسم نسبت پراکندگی حافظه؛ اگه خیلی از یک بیشتر باشه، یعنی ردیس رم بیشتری از سیستم‌عامل گرفته تا اندازه‌ای که داده‌ش لازم داره.

ردیس یا Memcached

ردیسMemcached
شکل مقداررشته، فهرست، مجموعه، هش و بیشترفقط رشته
بعد از خاموش شدنمی‌تونه برگرده (RDB، AOF)همه پاک می‌شه
کپی و نگهباندارهخودش نداره
هسته‌هادستورها با یه رشتهاز چند رشته استفاده می‌کنه
کاربردکش، نشست، صف، شمارنده، رتبهفقط کش

برای کش خالص و ساده، هر دو عالی‌ان. Memcached روی سرورهای خیلی پرهسته گاهی یه کم بیشتر می‌کشه. ولی چون ردیس با یه ابزار چند تا کار انجام می‌ده، امروز معمولا انتخاب اوله.

نسخه‌ها

ردیس از ۲۰۰۹ تا امروز خیلی بزرگ شده. نسخه‌ی ۲٫۶ در ۲۰۱۲ اجرای برنامه‌های کوچیک Lua رو آورد. نسخه‌ی ۲٫۸ نگهبان (Sentinel) رو جاافتاده کرد. نسخه‌ی ۳ در ۲۰۱۵ Cluster رو آورد. نسخه‌ی ۴ در ۲۰۱۷ بیرون انداختن LFU و پاک کردن کلیدهای بزرگ پشت صحنه رو. نسخه‌ی ۵ در ۲۰۱۸ جریان‌ها (stream) رو.

نسخه‌ی ۶ در ۲۰۲۰ ACL و رمز کردن ارتباط با TLS و رشته‌های جدا برای کار شبکه رو آورد. نسخه‌ی ۷ در ۲۰۲۲ توابع ماندگار و بهبودهای زیادی توی رم. و نسخه‌ی ۸ در ۲۰۲۵ امکانات جستجو، JSON و بردار رو داخل خود ردیس آورد. اگه سرورتون ردیس خیلی قدیمی داره، مثلا نسخه‌ی ۵ یا پایین‌تر، به‌روز کردنش هم امنیت رو بیشتر می‌کنه، هم ACL می‌ده.

داستان مجوز

ردیس ۱۵ سال با یه مجوز آزاد و ساده منتشر می‌شد؛ هر کسی می‌تونست هر جا ازش استفاده کنه، حتی بفروشش. مارس ۲۰۲۴، شرکتی که ردیس رو نگه می‌داره، مجوزش رو عوض کرد. استفاده‌ی معمولی، مثل گذاشتنش کنار سایت خودتون، آزاد موند؛ ولی شرکت‌هایی که ردیس رو به‌عنوان سرویس آماده به بقیه می‌فروختن، دیگه بی قرارداد نمی‌تونستن.

چند هفته بعد، یه گروه از برنامه‌نویس‌ها، زیر نظر یه بنیاد نرم‌افزار آزاد، آخرین نسخه‌ی آزاد ردیس رو برداشتن و با اسم Valkey ادامه دادن. Valkey با ردیس جوره؛ همون دستورها، همون فایل‌ها. خیلی از سیستم‌عامل‌های لینوکس و سرویس‌دهنده‌ها رفتن سراغش. ماه مه ۲۰۲۵، با ردیس ۸، ردیس یه مجوز آزاد دیگه هم اضافه کرد، به اسم AGPL، کوتاه‌شده‌ی Affero General Public License، که دوباره ردیس رو نرم‌افزار آزاد حساب می‌کنه.

برای شما که ردیس رو کنار سایت خودتون می‌ذارید، هیچ‌کدوم از این‌ها چیزی رو عوض نمی‌کنه. ردیس و Valkey هر دو کار می‌کنن، و افزونه‌های وردپرس با هر دو جورن.

تمرین

  1. روی یه سرور آزمایشی، redis-cli رو باز کنید و SET، GET، EXPIRE و INCR رو امتحان کنید.
  2. دستور INFO stats رو بزنید و نرخ برخورد رو حساب کنید.
  3. ببینید ردیس سرور شما روی کدوم آدرس گوش می‌ده، و از بیرون سرور بهش وصل نمی‌شه.

اشتباه‌های رایج

  • «ردیس جای دیتابیس اصلی رو می‌گیره.» برای بیشتر سایت‌ها نه؛ جیبه، نه کمد.
  • «سقف رم لازم نیست.» بی maxmemory، ردیس می‌تونه کل رم سرور رو بخوره.
  • «برای کش، noeviction خوبه.» وقتی پر بشه، نوشتن تازه رو رد می‌کنه.
  • «یه KEYS * بزنم ببینم چی توشه.» روی ردیس بزرگ، همه رو چند ثانیه معطل می‌کنه؛ SCAN بزنید.
  • «درگاه ۶۳۷۹ باز باشه، رمز که داره.» هیچ‌وقت؛ ردیس فقط روی خود سرور یا شبکه‌ی خصوصی.

جمع‌بندی. آنچه از این درس با خودتان می‌برید.

  • ردیس داده رو توی رم نگه می‌داره؛ برای همین خیلی سریعه، ولی جاش محدوده.
  • هر داده یه کلید داره و یه مقدار، و مقدار می‌تونه رشته، فهرست، مجموعه، هش و چیزهای دیگه باشه.
  • با maxmemory و سیاست بیرون انداختن، ردیس وقتی پر شد، کم‌استفاده‌ها رو بیرون می‌اندازه.
  • با RDB و AOF می‌تونه داده رو روی دیسک هم نگه داره تا بعد از قطع برق برگرده.
  • ردیس هیچ‌وقت نباید روی اینترنت باز باشه؛ فقط روی خود سرور، با رمز.

خودتون رو بسنجید

۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو می‌بینید: چند تا درست، چند تا نادرست.

خودتون رو بسنجید

۱۵ پرسش

  • هر بار پرسش‌ها و ترتیب گزینه‌ها عوض می‌شه.
  • تا آخر نمی‌گیم کدوم جواب درست بوده؛ می‌تونید برگردید و جوابتون رو عوض کنید.
  • آخرش کارنامه می‌گیرید: چند تا درست، چند تا نادرست.
  • اگه وسطش بستید، دوباره که باز کنید از همون‌جا ادامه می‌دید.

فصل‌های این درس