Redis واقعاً چیست
Redis یک مخزن کلید-مقدار است که در حافظه زندگی میکند. به آن یک کلید («user:1042:profile») و یک مقدار میدهید و آن مقدار را در لحظهی درخواست پس میدهد — معمولاً بسیار زیر یک میلیثانیه، چون در مسیر خواندن هیچچیز به دیسک نمیرسد. علاوه بر رشتههای ساده، ساختارهای دادهی کاربردی هم دارد: hash برای آبجکتها، لیست و مجموعهی مرتب برای فیدها و جدولهای امتیاز، مجموعه برای بررسی عضویت، و شمارنده با افزایش اتمیک.
همین ترکیب — سرعت RAM بهعلاوهی ساختارهای دادهی واقعی — دلیل حضورش در تقریباً هر پشتهی جدی وب است. Redis در ماندگاری و کوئریپذیری با دیتابیس شما رقابت نمیکند؛ رقابتش در *پاسخ سریع به یک پرسش تکراری* است، و این مسابقه را با دو یا سه مرتبهی بزرگی اختلاف میبرد.
مشکلی که حل میکند: کار پرهزینهی تکراری
به کاری که یک بکاند معمولی در هر درخواست انجام میدهد نگاه کنید: کاربر را بارگذاری میکند، تنظیمات را بارگذاری میکند، همان کوئری فهرست محصولات یا منویی را اجرا میکند که از بازدیدکنندهی قبلی تا حالا تغییری نکرده، و همه را رندر میکند. بیشتر این کار همان پاسخی را تولید میکند که چند ثانیه پیش تولید کرده بود. دیتابیس با این حال وظیفهشناسانه دوباره اجرایش میکند — تجزیه، برنامهریزی، خواندن صفحهها، join — و زیر ترافیک، این کوئریهای تکراری خیلی زودتر از CPU به گلوگاه تبدیل میشوند.
الگوی cache-aside دقیقاً همین را درست میکند: اول Redis را بررسی کن؛ اگر بود، نسخهی کششده را برگردان؛ اگر نبود، کوئری واقعی را اجرا کن، نتیجه را با یک زمان انقضا (TTL) ذخیره کن و برگردان. صفحهای که به پانزده کوئری نیاز داشت، حالا در مسیر گرم به پانزده جستوجوی حافظهای نیاز دارد. دیتابیس از خوردهشدن با هر درخواست، به یکبار در هر پنجرهی TTL میرسد — و به همین دلیل است که سایتها با Redis از جهشهای ترافیکی جان به در میبرند؛ همان جهشهایی که بدون آن، سایت را از پا میانداخت.
سشنها کار کلاسیک دوماند. نگهداشتن سشنهای ورود در Redis بهجای دیسک محلی یعنی هر کدام از replicaهای اپلیکیشن شما میتواند به هر کاربری سرویس بدهد — و مقیاسپذیری افقی اصلاً به همین دلیل کار میکند.
کجا Redis کمکی نخواهد کرد
یک مرزبندی صادقانه هفتهها وقت شما را نجات میدهد. Redis یک کوئری کند را بار اول سریع نمیکند — فقط اجرای *دوم* را ارزان میکند، پس ایندکس جاافتادهی دیتابیس همچنان یک ایندکس جاافتاده است. مسیر شبکهی کند تا origin یا تصاویر سنگین را هم درست نمیکند؛ آنها مشکل تحویلاند و در لبه حل میشوند، نه در RAM. و یک منبع حقیقتِ ماندگار هم نیست: حافظه محدود است و eviction بخشی از طراحی است، پس هر چیزی که از دست دادنش برایتان قابلتحمل نیست باید در دیتابیس باشد و Redis فقط یک نسخهی دورانداختنی از آن را نگه دارد.
هزینهی واقعی کش، ابطال آن است: یک قیمت کهنه یا یک بررسی دسترسیِ منقضی، باگی است که کاربرانتان میبینند. هرجا درستی مهم است TTL را کوتاه نگه دارید، وقتی دادهی زیرین تغییر میکند کلیدها را صریحاً حذف کنید، و در برابر کشکردن چیزهایی که با هر درخواست عوض میشوند مقاومت کنید — کشی با نرخ اصابت نزدیک به صفر، سربارِ خالص است.
Redis مدیریتشده: مسیر افزونه
راهاندازی Redis توسط خودتان روز اول سخت نیست — روز دویستم سخت است: محدودیتهای حافظه، ریاستارتها، ارتقای نسخه، و اطمینان از اینکه اپلیکیشن دوباره متصل میشود. یک نمونهی مدیریتشده همهی اینها را در دل پلتفرم جمع میکند.
روی پلتفرم کانتینری cdn.com.tr، Redis افزونهای است که به یک اپلیکیشن متصل میکنید. فعالکردنش نمونه را فراهم میکند و اتصال را بهصورت خودکار به محیط اپلیکیشن شما تزریق میکند — REDIS_HOST، REDIS_PORT، REDIS_DB و یک REDIS_URL آمادهی استفاده — تا فریمورکهایی مثل Laravel، Django یا WordPress آن را با پیکربندی بردارند، نه با کد. پلتفرم WordPress از همین افزونه بهعنوان کش آبجکت استفاده میکند، که برای یک سایت پرترافیک WordPress یکی از پراثرترین تغییرهای تکی است. افزونه را غیرفعال کنید و متغیرها هم همراهش پاک میشوند.
فعالسازی Redis مدیریتشده روی یک اپلیکیشن با cdnctl
# attach a managed Redis instance to your app
cdnctl container addons enable-redis --account <uuid> --app <app_uuid> --env-prefix REDIS
# see what is attached
cdnctl container addons list --account <uuid> --app <app_uuid>
# remove it again
cdnctl container addons disable-redis --account <uuid> --app <app_uuid>
Redis و CDN: دو لایهی کش، دو وظیفهی متفاوت
دقیقبودن دربارهی نسبت کش درونحافظهای با CDN میارزد، چون هر دو «کش»اند اما جای هم را نمیگیرند. CDN *پاسخها* را کش میکند — HTML آماده، تصاویر، فایلها — نزدیک بازدیدکننده، تا بسیاری از درخواستها اصلاً به اپلیکیشن شما نرسند. Redis *دادهها را درونِ* اپلیکیشن کش میکند تا درخواستهایی که میرسند، ارزان سرو شوند.
این دو روی هم اثر میگذارند: لبه اکثریت کشپذیر ترافیک را جذب میکند و Redis باقیماندهی شخصیسازیشده و کشناپذیر را سریع میکند. پشتهای که هر دو را دارد معمولاً صفحههای ناشناس را در چند ده میلیثانیه از لبه و صفحههای لاگینشده را از بکاندی گرمشده با Redis سرو میکند — همان معماریای که پشت بیشتر سایتهایی است که زیر بار هم آنی به نظر میرسند.
پرسشهای پرتکرار
آیا Redis یک دیتابیس است؟
میتواند روی دیسک ذخیره کند، اما این کاری نیست که باید برایش استخدامش کنید. با Redis مثل یک نسخهی سریع و دورانداختنی از دادهای رفتار کنید که منبع حقیقتش در یک دیتابیس واقعی زندگی میکند. اگر از دست رفتن دادهای برایتان دردناک است، جای آن فقط در Redis نیست.
اول چه چیزی را کش کنم؟
لاگ کوئریها جواب را میدهد: پرتکرارترین کوئریهای پرهزینهای که نتایجشان بهندرت عوض میشود — فهرست محصولات، منوها، تنظیمات، قطعههای رندرشده. آنها را با یک TTL معقول کش کنید و معمولاً بیشترِ دستاورد را در یک بعدازظهر به دست میآورید.
کش Redis چقدر حافظه نیاز دارد؟
کمتر از چیزی که بیشتر افراد تصور میکنند — نتایج کششدهی کوئریها و سشنها کوچکاند. متواضع شروع کنید، نرخ اصابت و evictionها را زیر نظر بگیرید، و فقط وقتی بزرگش کنید که eviction کلیدهای هنوز مفید ظاهر شود. نرخ اصابت بالا روی یک نمونهی کوچک، از یک نمونهی عظیمِ بیکار بهتر است.
آیا WordPress از Redis سود میبرد؟
بهطور محسوس. WordPress دائماً optionها و آبجکتها را از MySQL بازخوانی میکند؛ کش آبجکت Redis آنها را به جستوجوی حافظهای تبدیل میکند. روی پلتفرم مدیریتشدهی WordPress همین افزونهی Redis نقش کش آبجکت را دارد، در ترکیب با کش لبه در جلوی آن.