ahmad hasanzadeh branding logoahmad hasanzadeh branding logo
    خانهپروژه هامقالاتدرباره منتکنولوژی هاارتباط با من
ahmad hasanzadeh branding logoahmad hasanzadeh branding logo

ممنون که سر زدی ッ

© ۱۴۰۵

احمد حسن زاده. تمامی حقوق محفوظ است.

ردیس (Redis) چیست؟ راهنمای کامل دیتابیس درون‌حافظه‌ای

ردیس (Redis) چیست؟ راهنمای کامل دیتابیس درون‌حافظه‌ای

آشنایی کامل با Redis، دیتابیس و کش درون‌حافظه‌ای که سرعت پاسخ‌دهی اپلیکیشن‌ها را چند برابر می‌کند. ساختارهای داده، کاربردها و نکات مهم لایسنس.

اگر تا حالا روی یک پروژه بک‌اند جدی کار کرده باشید، حتماً اسم Redis به گوشتان خورده؛ معمولاً هم با یک توضیح ساده و ناقص: "یه کش هست دیگه". این توضیح واقعاً حق مطلب رو ادا نمی‌کنه. Redis یکی از انعطاف‌پذیرترین ابزارهای زیرساختی توسعه وب مدرنه و فهمیدن اینکه دقیقاً چیکار می‌کنه (و چیکار نمی‌کنه) بهتون کمک می‌کنه چه روی یک پروژه Next.js کار کنید چه یک API با NestJS.

نمای کلی معماری دیتابیس درون‌حافظه‌ای Redis

ردیس واقعاً چیست؟

Redis مخفف عبارت REmote DIctionary Server هست. در اصل، یک دیتابیس ساختار داده‌ی درون‌حافظه‌ای (in-memory) است؛ یعنی داده‌ها رو به‌جای دیسک، توی RAM نگه می‌داره. می‌تونه به‌عنوان دیتابیس، کش، یا message broker استفاده بشه — یا حتی هر سه با هم.

همین ویژگی "درون‌حافظه‌ای بودن" دلیل اصلی سرعت فوق‌العاده‌ی Redis است. خوندن و نوشتن روی RAM چندین برابر سریع‌تر از دیسک است، به همین دلیل Redis معمولاً عملیات‌ها رو در کمتر از یک میلی‌ثانیه انجام می‌ده.

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

سه تصمیم طراحی باعث سرعت Redis می‌شن:

  • همه‌چیز توی RAM ذخیره می‌شه. برای عملیات معمولی، هیچ I/O دیسکی توی مسیر خوندن/نوشتن وجود نداره.
  • یک event loop تک‌رشته‌ای (single-threaded) دستورات رو پردازش می‌کنه. شاید در نگاه اول یه bottleneck به نظر برسه، ولی در واقع overhead مربوط به lock و context-switching که دیتابیس‌های چندرشته‌ای درگیرش هستن رو حذف می‌کنه — چون بیشتر دستورات Redis پیچیدگی زمانی O(1) یا O(log n) دارن، یک رشته می‌تونه تعداد بسیار زیادی عملیات در ثانیه رو پردازش کنه.
  • ساختارهای داده‌ی اختصاصی. به‌جای یک "value" کلی، Redis ساختارهای native ارائه می‌ده که برای الگوهای دسترسی خاص بهینه شدن (در ادامه بیشتر توضیح می‌دیم).
  • نسخه‌ی 8.6 Redis که تا اوایل 2026 آخرین نسخه‌ی پایدار محسوب می‌شه، این مسیر رو با بهبود throughput و بهینه‌سازی مصرف حافظه ادامه داده، و ابزارهای بهتری برای تشخیص مشکلات "hot key" اضافه کرده — یکی از bottleneckهای رایج در دنیای واقعی که یک کلید به‌شدت بیشتر از بقیه درخواست می‌گیره.

    ساختارهای داده‌ی اصلی

    این بخشیه که واقعاً Redis رو از یک "key-value store" ساده متمایز می‌کنه:

    • Strings — ساده‌ترین نوع؛ برای شمارنده‌ها (INCR, DECR) و کش کردن JSON سریالایز شده هم کاربرد داره.
    • Hashes — جفت‌های field-value زیر یک کلید، مناسب برای نمایش object هایی مثل پروفایل کاربر.
    • Lists — مجموعه‌های مرتب، مناسب برای صف‌ها یا فیدهای فعالیت.
    • Sets — مقادیر یکتای بدون ترتیب، مناسب برای تگ‌ها یا چک عضویت.
    • Sorted Sets (ZSETs) — ست‌هایی که بر اساس یک score مرتب شدن، ستون فقرات لیدربوردها و rate limiter ها.
    • Streams — ساختار لاگ append-only برای سیستم‌های event-driven، از نظر مفهومی شبیه Kafka ولی سبک‌تر.
    redis-clibash
    SET user:1:name "Ahmad"
    GET user:1:name
     
    ZADD leaderboard 100 "player1"
    ZADD leaderboard 250 "player2"
    ZRANGE leaderboard 0 -1 WITHSCORES

    کاربردهای رایج در دنیای واقعی

    مسیر کش کردن از درخواست کاربر تا اپلیکیشن سرور، لایه کش Redis و دیتابیس
    • کش کردن (Caching) — رایج‌ترین کاربرد. نتایج کوئری‌های سنگین یا پاسخ API ها رو با یک TTL ذخیره می‌کنید تا کمتر به دیتابیس اصلی مراجعه بشه.
    • ذخیره‌ی session — سرعت بالای خوندن/نوشتن، Redis رو گزینه‌ی طبیعی برای ذخیره‌ی session کاربر در سیستم‌های توزیع‌شده می‌کنه.
    • Rate limiting — با sorted set ها یا شمارنده‌های ساده به همراه expiry، محدود کردن تعداد درخواست هر کاربر خیلی راحته.
    • پیام‌رسانی Pub/Sub — ارتباط real-time سبک بین سرویس‌ها.
    • لیدربورد — sorted set ها به‌صورت پیش‌فرض داده‌های رتبه‌بندی‌شده با پیچیدگی O(log n) برای insert و range query در اختیارتون می‌ذارن.
    • صف کارها (Job Queue) — list ها یا stream ها پشت بسیاری از پیاده‌سازی‌های صف سبک هستن (مثلاً BullMQ روی Redis ساخته شده).

    آیا با ری‌استارت شدن، داده‌ها از بین می‌رن؟ (Persistence)

    چون Redis توی RAM زندگی می‌کنه، یه سوال طبیعی پیش میاد: اگه پروسه ری‌استارت بشه چی می‌شه؟ Redis دو استراتژی persistence داره که می‌تونید ترکیبشون کنید:

    • RDB (Snapshotting) — به‌صورت دوره‌ای یک snapshot از کل دیتاست رو روی دیسک ذخیره می‌کنه.
    • AOF (Append Only File) — هر عملیات نوشتن رو لاگ می‌کنه، و Redis می‌تونه با replay کردن این لاگ در زمان استارت، دیتاست رو بازسازی کنه.

    اگه persistence تنظیم نشده باشه، داده‌ها واقعاً موقتی هستن — که برای کش خالص مشکلی نداره، ولی اگه بخواید Redis رو به‌عنوان منبع اصلی داده استفاده کنید بدون این تنظیمات، یک ریسک واقعیه.

    مقایسه‌ی Redis با Memcached و Valkey

    یک مقایسه‌ی کوتاه و صادقانه:

    • Memcached ساده‌تر و چندرشته‌ایه، اما فقط از key-value ساده پشتیبانی می‌کنه — نه ساختار داده‌ی غنی، نه persistence.
    • Valkey یک فورک متن‌باز از Redis است که توسط Linux Foundation نگهداری می‌شه و بعد از تغییر لایسنس Redis در سال 2024 ایجاد شد. برای اکثر کاربردها جایگزین مستقیمه، ولی هنوز در برخی قابلیت‌های جدیدتر Redis مثل vector set ها و بعضی عملیات time-series عقب‌تره.
    • Redis همچنان رهبر از نظر قابلیت‌ها، بزرگ‌ترین اکوسیستم، کتابخانه‌های کلاینت و ابزارهای enterprise رو داره.

    یک تغییر لایسنس که ارزش دونستن داره

    اگه چند سال پیش آخرین باری بوده که سراغ Redis رفتید، یک چیز تغییر کرده: Redis از لایسنس آزاد BSD فاصله گرفته. از نسخه‌ی 7.4 به بعد، به‌صورت دوگانه زیر لایسنس RSAL و SSPL منتشر شد، و از نسخه‌ی 8.0 (می 2025)، Redis گزینه‌ی AGPL رو هم به‌عنوان لایسنس سوم اضافه کرد. برای اکثر تیم‌هایی که فقط Redis رو به‌عنوان زیرساخت اجرا می‌کنن (و نه بازتوزیعش به‌عنوان یک محصول رقیب)، این موضوع تاثیر عملی نداره — ولی خوبه بدونیدش، چه تیم حقوقی‌تون بپرسه، چه در حال بررسی Valkey به‌عنوان جایگزین باشید.

    چه زمانی از Redis استفاده نکنیم

    Redis یک راه‌حل جادویی برای همه‌چیز نیست. مراقب باشید که تنها منبع حقیقت (source of truth) برای داده‌های حیاتی‌تون نباشه، مگر اینکه آگاهانه persistence رو تنظیم کرده باشید و trade-off هاش رو بشناسید. همچنین برای کوئری‌های تحلیلی سنگین یا داده‌های رابطه‌ای پیچیده گزینه‌ی مناسبی نیست — اون کار هنوز مال PostgreSQL یا مشابهشه.

    جمع‌بندی

    محبوبیت Redis واقعاً به‌جاست: شروع کارش ساده‌ست، در مقیاس کوچیک راحت اداره می‌شه، و بدون نیاز به بازنویسی می‌تونه به workload های جدی production برسه. چه اولین لایه‌ی کش‌تون رو اضافه می‌کنید، چه در حال طراحی rate limiter برای یک API عمومی هستید، فهمیدن ساختارهای داده‌اش — نه فقط "SET و GET" — چیزیه که ارزش واقعی Redis رو براتون باز می‌کنه.

    پیشنهاد من: اگه دارید Redis رو برای اولین بار توی یک پروژه‌ی Next.js یا NestJS اضافه می‌کنید، اول فقط به‌عنوان لایه‌ی کش با TTL منطقی ازش استفاده کنید، قبل از اینکه بخواید به‌عنوان session store یا queue backend ازش استفاده کنید. این کم‌ریسک‌ترین راه برای آشنایی باهاشه، و بعد از اینکه به تنظیمات eviction و persistence اطمینان پیدا کردید، می‌تونید نقشش رو گسترش بدید.

    هوش مصنوعی

    نویسنده:

    هوش مصنوعی
    دقیقه:8
    انتشار :۱۴۰۵/۵/۳
    آپدیت :۱۴۰۵/۵/۳

    دسته بندی ها

    بک‌اند

    تگ ها

    #Redis#کش (Cache)#دیتابیس#بک‌اند#NoSQL#درون‌حافظه‌ای