Redis چیست؛ دیتابیس داخل حافظه برای کش، سشن و صف

Redis چیست؟ کاربردها، ساختار داده‌ها و راه‌اندازی ردیس برای کش و صف

صفحهٔ محصول فروشگاه شما با هر بازدید سه کوئری سنگین به دیتابیس می‌زند. تا وقتی روزی چند صد بازدید دارید کسی متوجه نمی‌شود. یک کمپین تبلیغاتی کافی است تا همان سه کوئری در هر ثانیه صدها بار تکرار شوند و MySQL زیر بار بماند. بیشتر تیم‌ها در همین لحظه با Redis آشنا می‌شوند.

جواب کوتاه سؤال «Redis چیست» این است: یک دیتابیس داخل حافظه که جلوی دیتابیس اصلی می‌نشیند و جواب‌های تکراری را در کسری از میلی‌ثانیه برمی‌گرداند. پایین‌تر سرعتش را توضیح می‌دهیم، ساختارهای داده و روش‌های ذخیره روی دیسک را مرور می‌کنیم، آن را با Memcached و Valkey مقایسه می‌کنیم و چند دستور واقعی برای شروع می‌گذاریم. جاهایی را هم که Redis انتخاب بدی است می‌گوییم.

Redis چیست؟

Redis (مخفف Remote Dictionary Server) یک پایگاه دادهٔ کلید-مقدار است که داده را در حافظهٔ RAM نگه می‌دارد. سالواتوره سانفیلیپو آن را در سال ۲۰۰۹ نوشت تا مشکل سرعت یک سرویس تحلیل وب را حل کند. امروز Redis در بیشتر پشته‌های وب به‌عنوان کش، محل نگهداری سشن، صف کار و شمارنده استفاده می‌شود.

مستندات رسمی Redis خودش را «سرور ساختار داده» معرفی می‌کند. یعنی مقدار هر کلید فقط یک رشتهٔ ساده نیست؛ می‌تواند لیست، مجموعه، هش، مجموعهٔ مرتب یا استریم باشد و Redis روی همان ساختار دستور اجرا می‌کند. مثلاً به‌جای اینکه کل لیست را بخوانید، یک عضو به ته آن اضافه کنید و دوباره بنویسید، فقط می‌گویید RPUSH و کار در سمت سرور انجام می‌شود.

اگر با دسته‌بندی دیتابیس‌ها آشنا نیستید، Redis در گروه NoSQL قرار می‌گیرد. مقالهٔ دیتابیس NoSQL چیست و انواع پایگاه داده تصویر کلی را می‌دهند.

چرا Redis این‌قدر سریع است؟

سه دلیل اصلی دارد و هر سه در طراحی Redis عمدی‌اند:

  • داده در RAM است: خواندن از حافظه چند مرتبه سریع‌تر از خواندن از دیسک است، حتی دیسک NVMe. کوئری‌ای که در دیتابیس رابطه‌ای باید ایندکس را بگردد و صفحه‌ها را از دیسک بیاورد، در Redis یک جست‌وجوی مستقیم در جدول هش است.
  • اجرای تک‌رشته‌ای دستورها: Redis دستورها را یکی‌یکی روی یک رشتهٔ اصلی اجرا می‌کند. قفل و رقابت بین رشته‌ها وجود ندارد و هر دستور اتمیک است؛ برای همین INCR روی یک شمارنده هیچ‌وقت عدد را گم نمی‌کند. از نسخهٔ ۶ به بعد خواندن و نوشتن شبکه می‌تواند روی رشته‌های جدا (I/O threads) انجام شود، ولی اجرای خود دستورها همچنان ترتیبی است.
  • پروتکل ساده: کلاینت‌ها با پروتکل ساده و سبک RESP حرف می‌زنند و می‌توانند چند دستور را پشت هم بفرستند (pipelining) تا رفت‌وبرگشت شبکه کم شود.

همین طراحی یک هزینه هم دارد: یک دستور کند، مثل KEYS * روی میلیون‌ها کلید، کل سرور را برای همهٔ کلاینت‌ها معطل می‌کند. در محیط عملیاتی به‌جای آن از SCAN استفاده کنید.

 

الگوی cache-aside و جایگاه Redis چیست در مسیر درخواست بین برنامه و دیتابیس

 

ساختارهای داده در Redis

بیشترین سود Redis از انتخاب ساختار درست می‌آید. اگر همه چیز را به‌شکل رشتهٔ JSON ذخیره کنید، نیمی از امکاناتش را کنار گذاشته‌اید. جدول زیر پرکاربردترین‌ها را نشان می‌دهد:

ساختار دستور نمونه کاربرد رایج
String SET، GET، INCR کش خروجی صفحه یا API، شمارندهٔ بازدید، توکن موقت
Hash HSET، HGETALL پروفایل کاربر، سبد خرید، تنظیمات هر حساب
List LPUSH، BRPOP صف کار ساده، آخرین فعالیت‌ها
Set SADD، SISMEMBER تگ‌ها، کاربران آنلاین، حذف تکراری‌ها
Sorted Set ZADD، ZRANGE جدول امتیازات، صف اولویت‌دار، پنجرهٔ زمانی Rate Limit
Stream XADD، XREADGROUP صف پیام با گروه مصرف‌کننده و تأیید پردازش
JSON و Vector Set JSON.SET، VADD سند JSON با دسترسی به فیلد، جست‌وجوی برداری برای پروژه‌های هوش مصنوعی

از Redis 8 به بعد JSON، سری زمانی و ساختارهای احتمالاتی (مثل Bloom filter) داخل خود Redis Open Source آمده‌اند و دیگر ماژول جدا نیستند. فهرست کامل را در صفحهٔ Data Types مستندات Redis ببینید.

کاربردهای رایج Redis در پروژه‌های واقعی

کش جلوی دیتابیس

رایج‌ترین کاربرد Redis کش است. الگوی معمول cache-aside نام دارد: برنامه اول در Redis دنبال کلید می‌گردد؛ اگر بود، همان را برمی‌گرداند. اگر نبود، از دیتابیس اصلی می‌خواند، نتیجه را با یک زمان انقضا (TTL) در Redis می‌نویسد و بعد جواب می‌دهد. مفهوم کلی کش و انواعش را در مقالهٔ کشینگ چیست توضیح داده‌ایم.

سشن و توکن کاربران

وقتی برنامه روی چند کانتینر یا سرور اجرا می‌شود، سشن نمی‌تواند روی دیسک یکی از آن‌ها بماند. Redis سشن را برای همهٔ نمونه‌ها در دسترس می‌گذارد و با TTL خودش آن را پاک می‌کند. لاراول، جنگو و Express همه درایور سشن Redis دارند.

صف کار و پیام

ارسال ایمیل، ساخت تصویر بندانگشتی یا فراخوانی API کند را نباید داخل درخواست کاربر انجام داد. ابزارهایی مثل Laravel Queue، Celery (با Redis به‌عنوان broker)، BullMQ در Node.js و Sidekiq در Ruby کارها را در Redis صف می‌کنند و worker جدا آن‌ها را برمی‌دارد. برای پیام‌هایی که نباید گم شوند، Stream با گروه مصرف‌کننده گزینهٔ امن‌تری از List است.

محدودیت نرخ درخواست

شمارندهٔ اتمیک INCR همراه با EXPIRE ساده‌ترین پیاده‌سازی Rate Limiting است: برای هر IP در هر دقیقه یک کلید می‌سازید و اگر از سقف گذشت، درخواست را رد می‌کنید. الگوریتم‌های دقیق‌تر را در Rate Limiting چیست آورده‌ایم.

Pub/Sub و اعلان لحظه‌ای

با PUBLISH و SUBSCRIBE می‌توانید رویدادی را به همهٔ نمونه‌های برنامه برسانید؛ مثلاً اینکه کش یک محصول باید پاک شود یا یک پیام چت باید به سوکت‌های باز برسد. دقت کنید که Pub/Sub پیام را ذخیره نمی‌کند و اگر مشترکی آن لحظه وصل نباشد، پیام را از دست می‌دهد.

جدول امتیازات و شمارنده‌ها

Sorted Set برای رتبه‌بندی ساخته شده است. با ZINCRBY امتیاز کاربر را بالا می‌برید و با ZREVRANGE ده نفر اول را در یک دستور می‌گیرید؛ کاری که در SQL روی جدول بزرگ به مرتب‌سازی پرهزینه نیاز دارد.

ماندگاری داده در Redis: RDB یا AOF؟

«داده در RAM است» به این معنی نیست که با ری‌استارت همه چیز پاک می‌شود. Redis دو روش برای نوشتن روی دیسک دارد و می‌شود هر دو را با هم فعال کرد:

ویژگی RDB (اسنپ‌شات) AOF (لاگ نوشتن‌ها)
روش کار در فاصله‌های مشخص یک تصویر کامل از داده در فایل dump.rdb می‌نویسد هر دستور تغییردهنده را به انتهای فایل اضافه می‌کند و هنگام راه‌اندازی دوباره اجرا می‌کند
احتمال از دست رفتن داده تغییرات بعد از آخرین اسنپ‌شات، معمولاً چند دقیقه با تنظیم پیش‌فرض everysec حداکثر حدود یک ثانیه
حجم فایل فشرده و کوچک بزرگ‌تر؛ Redis آن را در پس‌زمینه بازنویسی و کوچک می‌کند
سرعت راه‌اندازی مجدد سریع‌تر برای دیتاست بزرگ کندتر، چون دستورها باید دوباره اجرا شوند
مناسب برای بکاپ دوره‌ای و انتقال به دیتاسنتر دیگر داده‌ای که از دست رفتنش هزینه دارد، مثل صف کار

توصیهٔ مستندات Persistence در Redis این است که اگر امنیت داده برایتان در حد PostgreSQL مهم است، هر دو را روشن کنید. اگر Redis فقط کش است، می‌توانید ماندگاری را کامل خاموش کنید؛ داده در هر حال از دیتابیس اصلی قابل بازسازی است.

 

مقایسه RDB و AOF برای ماندگاری داده در Redis

 

وقتی حافظه پر می‌شود: maxmemory و سیاست حذف کلید

RAM محدود است و Redis باید بداند وقتی به سقف رسید چه کند. با maxmemory سقف را تعیین می‌کنید و با maxmemory-policy رفتار بعد از آن را:

  • noeviction: چیزی حذف نمی‌شود و نوشتن جدید خطا می‌گیرد. برای وقتی که Redis داده‌ای نگه می‌دارد که نباید گم شود، مثل صف.
  • allkeys-lru: کلیدهایی که مدت بیشتری خوانده نشده‌اند حذف می‌شوند. برای کش عمومی پیش‌فرض خوبی است.
  • allkeys-lfu: کلیدهایی که کمتر استفاده شده‌اند حذف می‌شوند. وقتی چند کلید داغ دارید که همیشه باید بمانند.
  • volatile-lru و volatile-ttl: فقط بین کلیدهایی که زمان انقضا دارند انتخاب می‌کنند. اگر هیچ کلیدی TTL نداشته باشد، مثل noeviction رفتار می‌کنند.

یک خطای رایج: کش و صف کار را در یک نمونهٔ Redis با سیاست allkeys-lru می‌گذارند و بعد تعجب می‌کنند که چرا بعضی کارها هیچ‌وقت اجرا نشد. Redis کلید صف را هم مثل کش حذف کرده است. مستندات رسمی هم پیشنهاد می‌کند برای این دو نقش دو نمونهٔ جدا داشته باشید. جزئیات همهٔ سیاست‌ها در صفحهٔ Key eviction آمده است.

جایگاه Redis کنار دیتابیس اصلی

وقتی می‌پرسند Redis چیست و آیا می‌شود کل داده را در آن گذاشت، جواب معمولاً منفی است. Redis کوئری‌های پیچیده، JOIN، تراکنش چندجدولی با rollback و گزارش‌گیری تحلیلی ندارد. حجم داده‌اش هم به RAM گره خورده و RAM از دیسک گران‌تر است. در اغلب پروژه‌ها Redis کنار MySQL، PostgreSQL یا MongoDB می‌نشیند و بار تکراری را از آن‌ها برمی‌دارد.

اگر هنوز دیتابیس اصلی را انتخاب نکرده‌اید، مقایسهٔ MySQL یا PostgreSQL را بخوانید. بعد از آن تصمیم بگیرید کدام کوئری‌ها ارزش کش شدن دارند؛ معمولاً همان‌هایی که زیاد خوانده و کم تغییر داده می‌شوند.

Redis، Memcached یا Valkey؟

در سال ۲۰۲۴ Redis مجوز نسخه‌های جدیدش را از BSD به RSALv2 و SSPLv1 تغییر داد که هیچ‌کدام متن‌باز به تعریف OSI نیستند. در واکنش، بنیاد لینوکس پروژهٔ Valkey را از آخرین نسخهٔ BSD (یعنی 7.2) جدا کرد. از Redis 8 به بعد، Redis گزینهٔ سوم AGPLv3 را هم اضافه کرد و دوباره مجوز متن‌باز دارد. توضیح کامل را در صفحهٔ مجوزهای Redis ببینید. برای بیشتر تیم‌هایی که Redis را بدون تغییر در کد خودشان استفاده می‌کنند، این تغییرات اثر عملی ندارد.

معیار Redis Valkey Memcached
مجوز RSALv2، SSPLv1 یا AGPLv3 (از نسخهٔ 8) BSD BSD
ساختارهای داده کامل، به‌علاوهٔ JSON و Vector Set ساختارهای اصلی Redis، با ماژول برای امکانات بیشتر فقط کلید و مقدار رشته‌ای
ماندگاری روی دیسک RDB و AOF RDB و AOF ندارد
رپلیکیشن و کلاستر دارد دارد در خود سرور نه؛ پخش‌کردن کلیدها با کلاینت است
سازگاری با کلاینت‌های Redis بومی سازگار با پروتکل Redis پروتکل جدا
بهترین مورد استفاده کش، صف، سشن و امکانات جدید Redis تیم‌هایی که مجوز BSD برایشان مهم است کش سادهٔ چندرشته‌ای بدون نیاز به ماندگاری

Memcached هنوز برای کش خالص گزینهٔ سبک و قابل اعتمادی است؛ وردپرس و خیلی از سیستم‌های قدیمی‌تر با آن کار می‌کنند. ولی به محض اینکه به صف، سشن ماندگار یا ساختاری غیر از رشته نیاز پیدا کنید، Redis یا Valkey انتخاب منطقی‌تری است.

شروع کار با Redis: دستورهای پایه

بعد از اتصال با redis-cli این چند دستور را امتحان کنید. توضیح هر خط بعد از بلوک آمده است:

redis-cli -h your-redis-host -p 6379 -a 'your-password'

SET page:home "<html>...</html>" EX 300
GET page:home
TTL page:home

INCR visits:2026-11-12
HSET user:42 name "Sara" plan "pro"
HGETALL user:42

LPUSH jobs:email "welcome:42"
BRPOP jobs:email 5

ZADD leaderboard 120 "sara" 95 "ali"
ZREVRANGE leaderboard 0 9 WITHSCORES

SCAN 0 MATCH page:* COUNT 100
  • SET ... EX 300 مقدار را برای ۳۰۰ ثانیه نگه می‌دارد و TTL زمان باقی‌مانده را نشان می‌دهد.
  • INCR شمارنده را اتمیک بالا می‌برد؛ اگر کلید وجود نداشته باشد از صفر شروع می‌کند.
  • BRPOP تا ۵ ثانیه منتظر می‌ماند تا کاری در صف بیاید؛ worker صف معمولاً با همین دستور کار می‌کند.
  • SCAN کلیدها را دسته‌دسته برمی‌گرداند و برخلاف KEYS سرور را قفل نمی‌کند.

اتصال از برنامه

در کد، آدرس Redis را از متغیر محیطی بخوانید و هرگز رمز را داخل مخزن گیت نگذارید. نمونهٔ پایتون با کتابخانهٔ رسمی redis-py:

import os, json, redis

r = redis.from_url(os.environ["REDIS_URL"], decode_responses=True)

def get_product(product_id, db):
    key = f"product:{product_id}"
    cached = r.get(key)
    if cached:
        return json.loads(cached)
    product = db.fetch_product(product_id)
    r.set(key, json.dumps(product), ex=600)
    return product

در Node.js کتابخانهٔ node-redis یا ioredis همین کار را می‌کنند و در لاراول کافی است CACHE_STORE، SESSION_DRIVER و QUEUE_CONNECTION را روی redis بگذارید و مشخصات اتصال را در .env وارد کنید. برای بهینه‌سازی‌های دیگر سمت Node، مقالهٔ افزایش سرعت Node.js را ببینید.

امنیت Redis را جدی بگیرید

Redis برای اجرا در شبکهٔ مورد اعتماد طراحی شده است. مستندات امنیتی خودش صریح می‌گوید یک دستور FLUSHALL از طرف مهاجم کل داده را پاک می‌کند. حداقل این موارد را رعایت کنید:

  • پورت 6379 را روی اینترنت باز نگذارید؛ Redis را به آدرس داخلی bind کنید یا با فایروال فقط به سرورهای برنامه اجازه بدهید.
  • رمز طولانی بگذارید یا بهتر از آن، از ACL (از نسخهٔ ۶) برای ساخت کاربر با دسترسی محدود استفاده کنید.
  • اگر ترافیک از شبکهٔ عمومی عبور می‌کند، TLS را فعال کنید؛ دستور AUTH بدون TLS رمزنگاری نمی‌شود.
  • protected-mode را خاموش نکنید مگر اینکه دقیقاً بدانید چه جایگزینی برایش گذاشته‌اید.
  • Redis را با کاربر غیر root اجرا کنید.

متن کامل را در راهنمای امنیت Redis بخوانید.

راه‌اندازی Redis: روی سرور خودتان یا دیتابیس مدیریت‌شده؟

حالا که می‌دانید Redis چیست و کجا به کارتان می‌آید، باید تصمیم بگیرید چه کسی نگهداری‌اش را بر عهده بگیرد. دو مسیر اصلی دارید:

موضوع نصب روی سرور ابری دیتابیس مدیریت‌شده
نصب و به‌روزرسانی با شما؛ از مخزن سیستم‌عامل یا ایمیج داکر با ارائه‌دهنده؛ نسخه را از پنل انتخاب می‌کنید
تنظیم ماندگاری و حافظه کنترل کامل روی redis.conf تنظیمات رایج از قبل انجام شده
بکاپ باید اسکریپت و انتقال به جای دیگر را خودتان بنویسید بکاپ خودکار و بازگردانی از پنل
امنیت شبکه فایروال، bind و ACL روی دوش شماست دسترسی و رمز از پنل مدیریت می‌شود
مناسب برای تیمی که کنترل سطح سیستم‌عامل یا ماژول خاص می‌خواهد تیمی که می‌خواهد روی کد تمرکز کند

اگر سرور خودتان را ترجیح می‌دهید، Redis را روی سرور ابری چابکان نصب کنید و قبل از هر چیز فایروال را ببندید. اگر نمی‌خواهید درگیر نگهداری شوید، دیتابیس ابری Redis چابکان با چند کلیک ساخته می‌شود، بکاپ روزانهٔ خودکار دارد و مشخصات اتصال را در داشبورد سرویس می‌بینید. Redis در چابکان یک سرویس جداست و داخل سرویس‌هایی مثل هاست لاراول، هاست Node.js یا هاست پایتون نصب نیست؛ آن را می‌سازید و آدرسش را در متغیر محیطی برنامه می‌گذارید. برای مقایسهٔ پلن‌ها هم به جدول تعرفهٔ همان صفحه سر بزنید. فهرست بقیهٔ موتورها هم در صفحهٔ دیتابیس ابری هست.

تفاوت مدیریت دیتابیس توسط خودتان و ارائه‌دهنده را در دیتابیس مدیریت‌شده چیست و DBaaS چیست مفصل‌تر نوشته‌ایم.

اشتباه‌های رایج در استفاده از Redis

  • کش بدون TTL: کلیدهایی که هیچ‌وقت منقضی نمی‌شوند، حافظه را آرام‌آرام پر می‌کنند و داده‌ای قدیمی به کاربر نشان می‌دهند.
  • کلیدهای خیلی بزرگ: یک لیست چند میلیون عضوی یا رشتهٔ چند مگابایتی، هم حافظه را تکه‌تکه می‌کند و هم دستورهای روی آن کند می‌شوند. داده را به کلیدهای کوچک‌تر بشکنید.
  • اتکا به Redis به‌عنوان تنها نسخهٔ داده: اگر ماندگاری خاموش است و داده جای دیگری هم نیست، با اولین ری‌استارت از دست می‌رود.
  • نام‌گذاری بی‌نظم کلیدها: از پیشوند ثابت مثل app:entity:id استفاده کنید تا پاک‌کردن گروهی و مانیتورینگ ممکن باشد.
  • هجوم هم‌زمان به دیتابیس بعد از انقضا: وقتی یک کلید پرطرفدار منقضی می‌شود، صدها درخواست هم‌زمان به دیتابیس می‌روند. TTL را کمی تصادفی کنید یا برای بازسازی کش قفل کوتاه بگذارید.

سؤالات متداول

Redis چیست و به زبان ساده چه کاری می‌کند؟

Redis یک پایگاه دادهٔ کلید-مقدار است که داده را در RAM نگه می‌دارد. برنامه‌ها از آن برای کش، سشن، صف کار و شمارنده استفاده می‌کنند تا بار تکراری از دیتابیس اصلی برداشته شود و پاسخ‌ها سریع‌تر برگردند.

آیا Redis داده را بعد از ری‌استارت از دست می‌دهد؟

اگر ماندگاری خاموش باشد، بله. با فعال‌کردن RDB، AOF یا هر دو، داده روی دیسک ذخیره می‌شود و بعد از راه‌اندازی برمی‌گردد. با AOF و تنظیم پیش‌فرض، حداکثر حدود یک ثانیه از آخرین نوشتن‌ها ممکن است از دست برود.

Redis رایگان است؟

Redis Open Source رایگان است و از نسخهٔ 8 با یکی از سه مجوز RSALv2، SSPLv1 یا AGPLv3 منتشر می‌شود. نسخه‌های 7.2 و قدیمی‌تر BSD هستند. Redis Cloud و Redis Software محصولات تجاری شرکت Redis هستند.

فرق Redis با MySQL چیست؟

MySQL دیتابیس رابطه‌ای روی دیسک است با جدول، JOIN و تراکنش کامل. Redis داده را در حافظه و به‌شکل ساختارهای سادهٔ کلید-مقدار نگه می‌دارد و برای دسترسی بسیار سریع ساخته شده است. معمولاً هر دو را با هم استفاده می‌کنند.

برای وردپرس Redis لازم است؟

برای سایت کوچک ضروری نیست. وقتی ترافیک بالا رفت یا ووکامرس کوئری‌های تکراری زیادی زد، Object Cache با Redis بار دیتابیس را کم می‌کند. افزونه‌هایی مثل Redis Object Cache این اتصال را برقرار می‌کنند. قبل از آن، افزونه‌های سنگین را بررسی کنید؛ فهرستی از آن‌ها را در افزونه‌هایی که منابع سرور را می‌بلعند آورده‌ایم.

Redis را با داکر اجرا کنم یا سرویس آماده بگیرم؟

برای محیط توسعه، اجرای ایمیج رسمی redis با داکر ساده‌ترین راه است. مقالهٔ Docker Compose چیست نشان می‌دهد چطور Redis را کنار برنامه بالا بیاورید. در محیط عملیاتی، اگر نمی‌خواهید بکاپ و به‌روزرسانی و امنیت را خودتان مدیریت کنید، سرویس مدیریت‌شده زمان کمتری از تیم می‌گیرد.

دیدگاه خود را بنویسید:

آدرس ایمیل شما نمایش داده نخواهد شد.

فوتر سایت