ردیس چیست

Redis چیست و چه کاربردهایی دارد؟

Redis یک پایگاه داده In-Memory است که داده‌ها را در RAM ذخیره می‌کند و به همین دلیل چندین برابر سریع‌تر از پایگاه‌داده‌های سنتی عمل می‌کند. از کش کردن و مدیریت Session گرفته تا صف‌های پردازش و رتبه‌بندی لحظه‌ای، Redis در سناریوهای متنوعی کاربرد دارد. در این مقاله، درباره Redis بخوانید و با کاربردهای آن آشنا شوید.

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

لیمو، نزدیک‌تر به تو

آموزش‌های لیمو را در گوگل راحت‌تر پیدا کن

لیموهاست را به منابع ترجیحی گوگلت اضافه کن تا گوگل بداند خواندن آموزش‌های ما برایت مهم است.

افزودن لیمو به گوگل من؛ انتخاب منبع در گوگلدر پنجرهٔ گوگل، انتخاب لیموهاست را تأیید کن.

اینجاست که Redis وارد می‌شود.

Redis یک پایگاه داده متن‌باز است که داده‌ها را نه روی دیسک، بلکه مستقیماً در RAM ذخیره می‌کند. نتیجه؟ سرعتی که پایگاه‌داده‌های سنتی به آن نمی‌رسند و پاسخ‌دهی در حد میکروثانیه، بدون صبر کردن و بدون تأخیر.

اما Redis فقط یک ابزار سرعت نیست. امروز در قلب معماری سرویس‌هایی مثل GitHub، Stack Overflow و Pinterest نشسته است — نه فقط برای کش کردن، بلکه برای مدیریت Session کاربران، پردازش صف‌های کاری، رتبه‌بندی لحظه‌ای و خیلی بیشتر.

در این مقاله توضیح می‌دهیم: Redis چیست، چطور کار می‌کند، کجا باید از آن استفاده کرد و مزایا و معایب آن چیست.

⭐ محتوای مرتبط: پایگاه داده چیست؟ اجزا، کاربردها و انواع پایگاه داده

Redis چیست؟

Redis مخفف Remote Dictionary Server است و در دنیای برنامه‌نویسی به عنوان یک پایگاه داده متن باز در حافظه (In-Memory Database) شناخته می‌شود. ردیس برخلاف دیتابیس‌های معمولی داده‌ها را در درجه اول در RAM نگه می‌دارد (نه روی هارد)، اما برای ماندگاری می‌تواند آن‌ها را به‌صورت دوره‌ای یا لحظه‌ای روی دیسک هم ذخیره کند

این ویژگی باعث می‌شود که Redis به مراتب سریع‌تر از پایگاه داده‌های سنتی (مانند MySQL و PostgreSQL) عمل کند. یک مثال می‌زنم که چرایی این مساله را درک کنید.

برای درک تفاوت، هارد را مثل کتابخانه‌ای بزرگ تصور کنید: جای زیادی دارد، اما هر بار باید بلند شوید و کتاب را از قفسه بیاورید. RAM مثل میز کار است: هرچه روی آن باشد، در دسترس شماست. Redis همان میز کار است. میز کار جای محدودی دارد؛ برای همین Redis معمولاً برای داده‌های پرمراجعه و موقتی استفاده می‌شود، نه برای همۀ داده‌ها.

Redis به‌عنوان پایگاه داده، حافظه پنهان و کارگزار پیام

این‌ها سه نقش اصلی ردیس هستند:

  • به‌عنوان پایگاه داده (Database): داده‌ها را با کلید ذخیره و بازیابی می‌کند. برای داده‌هایی مناسب است که سرعت دسترسی به آن‌ها مهم‌تر از پیچیدگی پرس‌وجوست، مثل Session یا شمارنده. برای داده‌های حیاتی و بلندمدت، مثل سفارش‌ها و اطلاعات مالی، معمولاً یک پایگاه داده اصلی مثل MySQL یا PostgreSQL انتخاب بهتری است.
  • به‌عنوان حافظه پنهان (Cache): رایج‌ترین کاربرد Redis. نتیجۀ درخواست‌های پرتکرار را موقتاً نگه می‌دارد تا هر بار سراغ پایگاه داده اصلی نرویم.

مثال: فروشگاهی قیمت هر محصول را از پایگاه داده اصلی می‌خواند. فروشگاه اول از Redis می‌پرسد: «قیمت این محصول را دارید؟» اگر داشته باشد، همان لحظه جواب می‌دهد. اگر نداشته باشد، قیمت را از پایگاه داده اصلی می‌گیرد، یک نسخه در Redis ذخیره می‌کند و برای مدتی مشخص نگه می‌دارد. این مدت را زمان انقضا (TTL) می‌نامند. به این ترتیب درخواست‌های بعدی مستقیم از Redis پاسخ می‌گیرند و فشار وارده بر پایگاه داده اصلی کم می‌شود. TTL هم جلوی ماندن قیمت‌های قدیمی برای همیشه را می‌گیرد.

  • به عنوان کارگزار پیام (Message Broker): نقش پستچی را بازی می‌کند.

مثال: وقتی در یک فروشگاه روی دکمۀ «خرید» کلیک می‌کنید، کارهایی مثل ارسال ایمیل، تأیید یا ساخت فاکتور، می‌توانند به‌صورت یک Job در صفی مبتنی بر Redis قرار بگیرند. سپس یک Worker این کارها را در پس‌زمینه پردازش می‌کند؛ بنابراین کاربر لازم نیست منتظر تمام شدن این فرایندها بماند. در مقابل، عملیات حساس مثل ثبت پرداخت و کاهش موجودی معمولاً باید با استفاده از تراکنش‌ها در پایگاه داده اصلی انجام شوند تا سازگاری و صحت اطلاعات حفظ شود.

Redis چگونه کار می‌کند؟

برای اینکه بفهمیم Redis چطور کار می‌کند، باید به ۳ ویژگی کلیدی آن نگاه کنیم. این ویژگی‌ها دقیقاً همان چیزی هستند که Redis را از پایگاه‌داده‌های سنتی (مثل MySQL) متمایز می‌کند:

۱. معماری تک‌رشته‌ای (Single-Threaded Event Loop)

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

معماری تک رشته ای

اما ردیس چطور کار می‌کند؟

Redis از مدل تک‌رشته‌ای برای پردازش دستورات استفاده می‌کند؛ یعنی هر دستور به‌صورت پشت‌سرهم و بدون نیاز به قفل‌گذاری یا تعویض بین پردازش‌ها اجرا می‌شود. این موضوع باعث کاهش overhead و افزایش سرعت می‌شود.

البته Redis با استفاده از I/O غیرهمزمان می‌تواند چندین اتصال را مدیریت کند و به همین دلیل عملکرد آن در عمل بسیار سریع است.

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

نحوه کار Redis

۲. ذخیره‌سازی در حافظه اصلی (In-Memory Data Storage)

دیتابیس‌های سنتی معمولاً داده‌ها را روی دیسک (HDD یا SSD) ذخیره می‌کنند که سرعت دسترسی به آن‌ها در حد میلی‌ثانیه است.

اما Redis چطور کار می‌کند؟

Redis داده‌ها را در حافظه اصلی (RAM) نگه می‌دارد که سرعت دسترسی به آن در حد میکروثانیه یا حتی نانوثانیه است؛ به همین دلیل، Redis عملکرد بسیار سریعی دارد.

البته Redis برای جلوگیری از از دست رفتن داده‌ها، می‌تواند به‌صورت اختیاری اطلاعات را روی دیسک نیز ذخیره (persist) کند. همین ترکیبِ استفاده از RAM و طراحی بهینه باعث شده Redis چندین برابر سریع‌تر از دیتابیس‌های دیسکی عمل کند.

نکته کلیدی 🔑

چون RAM با قطع برق خالی می‌شود، Redis دو روش اختیاری برای نگهداری داده روی دیسک دارد:

  • RDB: در فواصل زمانی مشخص از کل داده‌ها یک Snapshot می‌گیرد.
  • AOF: هر دستور نوشتن را در یک فایل ثبت می‌کند و بعد از ری‌استارت، آن‌ها را دوباره اجرا می‌کند.

این دو روش را می‌توانیم با هم ترکیب کنیم. RDB سبک‌تر است، اما تغییرات بعد از آخرین Snapshot را ممکن است از دست بدهد. AOF دقیق‌تر است، اما فایل بزرگ‌تری تولید می‌کند و بار بیشتری روی دیسک دارد. ریسک این روش‌ها را در بخش معایب توضیح داده‌ایم.

۳. ساختار داده‌های بهینه‌شده (Data Structures)

Redis فقط یک «انبار ساده» برای ذخیره داده‌ها نیست. داده‌ها در Redis می‌توانند در قالب ساختارهای مختلفی مثل String، Hash، List، Set و Sorted Set ذخیره شوند و هرکدام دستورها و کاربردهای مخصوص خودشان را دارند.

برای مثال در Sorted Set، هر عضو یک امتیاز دارد و اعضا همیشه بر اساس امتیاز مرتب می‌مانند. به همین دلیل، برای گرفتن ۱۰ نفر اول یک جدول امتیازات، Redis نیازی به مرتب‌سازی کل داده‌ها ندارد. زمان این عملیات‌ها با افزایش تعداد اعضا فقط به‌صورت لگاریتمی زیاد می‌شود.

در مقابل، دیتابیس‌های سنتی هم می‌توانند با استفاده از index این کار را بهینه کنند؛ اما Redis به‌صورت پیش‌فرض برای چنین سناریوهایی طراحی شده و عملکرد بسیار سریعی ارائه می‌دهد.

چرخه حیات یک درخواست در ردیس

وقتی برنامۀ شما یک درخواست به Redis ارسال می‌کند، فرآیند زیر رخ می‌دهد:

  • دریافت: درخواست از طریق شبکه به Redis می‌رسد.
  • مدیریت رویداد: درخواست وارد چرخه‌ی event loop می‌شود و در صف رویدادها قرار می‌گیرد.
  • اجرا: Redis به‌صورت تک‌رشته‌ای، درخواست‌ها را یکی‌یکی پردازش کرده و با استفاده از ساختارهایی مثل Hash Table به‌سرعت به داده‌ی موردنظر در RAM دسترسی پیدا می‌کند.
  • پاسخ: نتیجه فوراً به برنامه بازگردانده می‌شود.

یک نکته فنی جذاب: I/O Multiplexing

شاید این سؤال پیش بیاید که اگر Redis تک‌رشته‌ای است، چگونه می‌تواند هزاران اتصال همزمان را مدیریت کند؟

Redis از تکنیکی به نام I/O Multiplexing (مثل epoll در لینوکس) استفاده می‌کند. در این روش، Redis به‌جای منتظر ماندن برای هر اتصال، از سیستم‌عامل می‌خواهد که هر زمان داده‌ای از هرکدام از ارتباط‌ها آماده شد، به او اطلاع دهد.

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

i/o multiplexing

مهم‌ترین کاربردهای Redis

Redis به دلیل سرعت بسیار بالا و ذخیره‌سازی داده‌ها در حافظه (RAM)، در بسیاری از پروژه‌های نرم‌افزاری و وب مورد استفاده قرار می‌گیرد. این ابزار تنها یک سیستم کش نیست و می‌تواند در سناریوهای مختلفی به بهبود عملکرد و مقیاس‌پذیری برنامه‌ها کمک کند.

۱) کش (Cache)

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

💡برای اینکه درباره انواع کش سایت، فعال‌سازی آن و مشکلات احتمالی بیشتر بدانید، این مقاله را بخوانید: کش سایت چیست؟ انواع کش سایت و نحوه کار آن

۲) ذخیره‌سازی Session کاربران

در اپلیکیشن‌های وب، اطلاعات نشست (Session) کاربران مانند وضعیت ورود به حساب کاربری یا تنظیمات موقت می‌تواند در Redis ذخیره شود. این کار باعث دسترسی سریع به اطلاعات و مدیریت بهتر کاربران در محیط‌های توزیع‌شده می‌شود.

۳) مدیریت صف‌ها (Queues)

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

۴) محدود کردن نرخ درخواست‌ها (Rate Limiting)

Rate Limiting یا محدودسازی نرخ درخواست یعنی جلوگیری از اینکه یک کاربر (یا یک بات) بیشتر از حد مجاز، در یک بازه زمانی خاص، به سایت یا API شما درخواست بفرستد. مثلاً: «هر کاربر فقط می‌تواند ۵ بار در دقیقه از سایت من «رمز عبور» درخواست کند.»

چرا برای این کار از Redis استفاده می‌شود؟ چون Rate Limiting باید فوق‌العاده سریع باشد. اگر بخواهید برای هر درخواست، اول به دیتابیس اصلی بروید، تعدادِ درخواست‌هایِ زیاد خودش باعثِ از کار افتادنِ دیتابیس می‌شود! Redis چون در RAM است، می‌تواند در کسری از میلی‌ثانیه بگوید مجاز هستی یا نه.

۵) رتبه‌بندی (Leaderboard)

بازی‌های آنلاین، پلتفرم‌های آموزشی و اپلیکیشن‌های رقابتی از Redis برای ایجاد جدول رتبه‌بندی کاربران استفاده می‌کنند. ساختار داده Sorted Set در Redis امکان مرتب‌سازی سریع امتیازات و نمایش رتبه‌ها را فراهم می‌کند.

۶) آنالیز آمار لحظه‌ای (Real-time analytics)

به‌دلیل سرعت بالای پردازش، Redis گزینه‌ای مناسب برای جمع‌آوری و تحلیل داده‌های لحظه‌ای است. کسب‌وکارها می‌توانند اطلاعاتی مانند تعداد بازدیدها، رفتار کاربران یا آمار فروش را به‌صورت آنی پردازش کنند یا ببینند.

۷) پیام‌رسانی و Pub/Sub

Redis از الگوی Publish/Subscribe پشتیبانی می‌کند که برای ارسال پیام بین سرویس‌ها و برنامه‌های مختلف کاربرد دارد. این قابلیت در معماری‌های مبتنی بر میکروسرویس و سیستم‌های بلادرنگ بسیار مفید است.

۸) ذخیره داده‌های موقت و پرتکرار

هر داده‌ای که نیاز به دسترسی سریع داشته باشد، مانند کدهای تأیید، توکن‌های احراز هویت، نتایج جستجو یا تنظیمات موقت کاربران، می‌تواند در Redis ذخیره شود تا عملکرد سیستم بهبود پیدا کند.

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

مزایای Redis چیست؟

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

سرعت بسیار بالا

Redis داده‌ها را در حافظه RAM ذخیره می‌کند؛ به همین دلیل عملیات خواندن و نوشتن در آن با سرعت بسیار بالایی انجام می‌شود. این ویژگی باعث شده Redis به یکی از محبوب‌ترین ابزارها برای کش کردن داده‌ها تبدیل شود.

مقیاس‌پذیری مناسب

با افزایش تعداد کاربران و درخواست‌ها، Redis می‌تواند از طریق Replication و Clustering مقیاس‌پذیری خوبی ارائه دهد. این قابلیت به کسب‌وکارها کمک می‌کند بدون افت عملکرد، حجم بیشتری از ترافیک را مدیریت کنند.

اگر ساده‌تر بخواهم بگویم: «بزرگتر کردن میز کار بدون اینکه دست و پا گیر شود.»

۱. Replication (کپی کردن میز کار)

فرض کنید یک منشی خیلی سریع دارید که به همهٔ درخواست‌ها پاسخ می‌دهد. اگر ۱۰۰۰ نفر همزمان از او سؤال بپرسند، طبیعتاً خسته و کند می‌شود.

  • راهکار: ما چند تا منشی کمکی (Replica) استخدام می‌کنیم.
  • روش: منشی اصلی هر کاری که انجام می‌دهد (هر داده‌ای که می‌گیرد)، فوراً به بقیهٔ منشی‌ها هم می‌گوید تا آن‌ها هم عین همان را روی میز خودشان بنویسند.
  • فایده: حالا اگر ۱۰۰۰ نفر سؤال داشتند، می‌توانیم سؤال‌ها را بین منشی‌های کمکی پخش کنیم. منشی اصلی فقط کارهای مهم (نوشتن) را انجام می‌دهد و بقیه فقط پاسخ می‌دهند (خواندن). این یعنی سرعت پاسخ‌دهی بیشتر می‌شود.

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

۲. Clustering (تکه تکه کردن میز)

حالا فرض کنید حجم اطلاعات شما آنقدر زیاد شده که دیگر روی یک میز جا نمی‌شود. حتی اگر ۱۰۰ تا منشی هم داشته باشید، باز هم مشکل اینجاست که داده‌ها روی یک میز جا نمی‌شود.

  • راهکار: میز اصلی را به چند تکه (بخش‌های مختلف) تقسیم می‌کنیم.
  • روش: مثلاْ داده‌های کاربرانِ «تهران» روی بخش شماره ۱و کاربران «اصفهان» روی بخش شماره ۲ قرار داده می‌شوند؛ و به همین ترتیب.
  • فایده: حالا لازم نیست کل دنیا را در یک بخش جستجو کنیم. هر درخواست به بخش مخصوص خودش ارسال می‌شود. این کار باعث می‌شود حجمِ بسیار زیادی از داده را، بدون اینکه حافظه یک سرور تمام شود، مدیریت کنیم.

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

پشتیبانی از انواع ساختار داده

برخلاف بسیاری از سیستم‌های کش، Redis فقط برای ذخیره کلید و مقدار (Key-Value) نیست. این ابزار از ساختارهای داده مختلفی مانند String، List، Set، Hash، Sorted Set و Stream پشتیبانی می‌کند که توسعه قابلیت‌های پیچیده‌تر را آسان‌تر می‌کند.

متن‌باز و رایگان

Redis یک پروژه متن‌باز است و جامعه بزرگی از توسعه‌دهندگان از آن پشتیبانی می‌کنند. این موضوع باعث شده مستندات، آموزش‌ها و ابزارهای جانبی فراوانی برای آن در دسترس باشد.

مناسب برای کاربردهای متنوع

از کش کردن داده‌ها گرفته تا مدیریت Session کاربران، صف‌های پردازش (Queue)، سیستم‌های Real-Time و حتی Rate Limiting، Redis در سناریوهای مختلف عملکرد بسیار خوبی دارد.

نکته جالب اینجاست که بسیاری از سرویس‌های بزرگ دنیا مانند GitHub، Stack Overflow و Pinterest از Redis برای بهبود عملکرد سیستم‌های خود استفاده می‌کنند. شما اگر بخواهید سرعت بارگذاری یک فروشگاه اینترنتی یا API را افزایش دهید، Redis می‌تواند یکی از اولین گزینه‌های شما باشد.

معایب Redis چیست؟

ردیس همیشه هم بهترین انتخاب نیست و بستگی دارد که شما از آن چه انتظاری داشته باشید. در ادامه چندتا از نقاط ضعف مهم Redis را می‌گوییم.

۱. مصرف بالای RAM

Redis داده‌ها را عمدتاً در حافظه نگهداری می‌کند. از آنجایی که RAM گران‌تر از فضای دیسک است، برای حجم‌های بزرگ داده هزینه بالا می‌رود. همچنین اگر دیتاست شما از حافظه فیزیکی سرور فراتر رود، پرفورمنس به شدت کاهش می‌یابد یا کرش می‌کند.

۲. عدم پشتیبانی کامل از کوئری‌های پیچیده

زبان دستوری Redis ساده است و برخلاف دیتابیس‌های رابطه‌ای (مانند PostgreSQL یا MySQL) Join یا شرط‌های پیچیده SQL را ندارد. به همین دلیل، Queryهای تحلیلی پیچیده محدود هستند.

Redis برای سناریوهای گزارش‌گیری، تحلیل داده و پرس‌وجوهای چندبعدی مناسب نیست؛ هرچند ماژول‌هایی مانند RedisJSON و RediSearch تا حدودی این مشکل را حل کرده‌اند.

پایگاه داده رابطه‌ای چیست؟

پایگاه داده رابطه‌ای (Relational Database) نوعی پایگاه داده است که داده‌ها را در قالب جدول‌هایی (Table) شامل ردیف (Row) و ستون (Column) ذخیره می‌کند. هر جدول نشان‌دهنده یک موجودیت (Entity) مانند «مشتری»، «محصول» یا «سفارش» است و ارتباط بین این جدول‌ها از طریق کلیدها (Keys) برقرار می‌شود.

ویژگی‌های کلیدی:

  • ساختار جدولی: داده‌ها به‌صورت منظم و بدون افزونگی ذخیره می‌شوند.
  • کلید اصلی (Primary Key): هر سطر را به‌طور یکتا شناسایی می‌کند (مثلا کد ملی یا شماره سفارش).
  • کلید خارجی (Foreign Key): ستونی که به کلید اصلی جدول دیگر اشاره دارد و ارتباط بین جدول‌ها را ایجاد می‌کند.
  • یکپارچگی ارجاعی (Referential Integrity): تضمین می‌کند که روابط بین جدول‌ها همیشه معتبر بمانند.

۳. محدودیت در مدل داده‌ای

مدل اصلی ردیس key-value است. مدل‌سازی ارتباطات پیچیده (مثلا روابط many-to-many) در آن نسبت به پایگاه‌های رابطه‌ای دشوارتر و نیازمند طراحی دقیق ساختارهای تو در تو (با استفاده از Hash یا Set) است.

مدل Key-Value در Redis

در Redis، هر داده با یک کلید (Key) ذخیره می‌شود و با همان کلید بازیابی می‌شوند. این مدل، که به آن Key-Value Store می‌گویند، پایۀ معماری Redis است.

برخلاف پایگاه‌داده‌های رابطه‌ای که داده‌ها را در قالب جدول، سطر و ستون سازمان‌دهی می‌کنند، Redis داده‌ها را در قالب جفت‌های کلید-مقدار یا Key-Value نگه می‌دارد و معمولاً آن‌ها را در حافظه RAM ذخیره می‌کند. به همین دلیل، عملیات ساده‌ای مثل GET و SET بسیار سریع انجام می‌شوند. (البته سرعت همه عملیات یکسان نیست و برخی دستورها با افزایش حجم داده، زمان بیشتری برای اجرا نیاز دارند.)

ساختار کلید در Redis

کلیدها در Redis رشته‌های متنی هستند و هیچ محدودیت ساختاری‌ای روی آن‌ها اعمال نمی‌شود. با این حال، قرارداد رایج در میان توسعه‌دهندگان، استفاده از دونقطه (:) برای سازماندهی سلسله‌مراتبی است:

  • user:1001:profile
  • order:20240601:status
  • cache:homepage:html

این الگو نه‌تنها خوانایی کد را بالا می‌برد، بلکه مدیریت و جستجوی کلیدها را نیز آسان‌تر می‌کند.

انواع مقدار (Value Types)

یکی از تمایزات Redis نسبت به Key-Value Storeهای ساده، پشتیبانی از انواع داده‌ است. مقدار متناظر با هر کلید می‌تواند یکی از ساختارهای زیر باشد:

  • String: کش ساده، شمارنده، توکن
  • Hash: ذخیرۀ آبجکت‌ها (مثل اطلاعات کاربر)
  • List: صف (Queue)، تاریخچۀ رویدادها
  • Set: مجموعۀ یکتا، تگ‌ها
  • Sorted Set: لیدربورد، رتبه‌بندی

۴. مدیریت دستی حافظه

Redis مانند پایگاه‌داده‌های رابطه‌ای به‌صورت خودکار حافظه را مدیریت نمی‌کند. توسعه‌دهندگان باید سیاست‌های حذف داده (Eviction Policies) را خودشان تنظیم کنند تا مشخص شود وقتی حافظه پر شد، چه داده‌هایی قرار است حذف شوند.

البته در Redis Cloud این مشکل تا حد زیادی برطرف شده است، زیرا این سرویس مدیریت حافظه را به‌صورت خودکار انجام می‌دهد.

۵. احتمال از دست رفتن داده‌ها

همان‌طور که اشاره شد، Redis داده‌ها را در RAM نگهداری می‌کند. بنابراین اگر سرور به‌طور ناگهانی از کار بیفتد، ممکن است کل داده‌ها یا بخشی از آن‌ها از بین بروند.

هرچند Redis مکانیزم‌هایی مانند RDB و AOF را برای ماندگاری داده‌ها ارائه می‌دهد، اما این روش‌ها کاملاً بدون ریسک نیستند.

برای مثال، بالاتر گفتیم که در روش RDB، در بازه‌های زمانی مشخص، از کل داده‌ها یک Snapshot گرفته و روی دیسک ذخیره می‌شود. حالا اگر Redis قبل از گرفتن Snapshot بعدی از کار بیفتد، تمام تغییراتی که پس از آخرین Snapshot انجام شده‌اند از دست خواهند رفت!

تفاوت Redis و Memcached

هر دو Redis و Memcached سیستم‌های ذخیره‌سازی داده در حافظه (In-Memory Data Store) هستند و معمولاً برای کش (Cache) کردن داده‌ها و افزایش سرعت برنامه‌ها استفاده می‌شوند. اما تفاوت‌های مهمی دارند:

ویژگی Redis Memcached
ساختار داده از انواع مختلف داده پشتیبانی می‌کند (String، List، Set، Hash، Sorted Set و…) فقط Key-Value ساده
ماندگاری داده (Persistence) دارد؛ می‌تواند داده‌ها را روی دیسک ذخیره کند ندارد؛ با ری‌استارت شدن همه داده‌ها پاک می‌شوند
مصرف حافظه کمی بیشتر معمولاً بهینه‌تر و سبک‌تر
حداکثر حجم هر مقدار (value) تا ۵۱۲ مگابایت (قابل تنظیم تا ۱ گیگابایت) تا ۱ مگابایت (پیش‌فرض، قابل افزایش)
سرعت بسیار سریع در عملیات کش ساده معمولاً کمی سریع‌تر
همتاسازی (Replication) دارد ندارد
High Availability پشتیبانی می‌کند (Redis Sentinel و Cluster) پشتیبانی داخلی ندارد
پشتیبانی از Pub/Sub دارد (Pub/Sub کامل، Streams با مصرف‌کننده گروهی) ندارد
Lua Scripting دارد (اجرای اسکریپت‌های پیچیده اتمیک روی سرور) ندارد
مقیاس‌پذیری Redis Cluster Sharding در سطح اپلیکیشن
مدل توزیع Native Cluster (شفاف برای کلاینت)، Sentinel (Failover)، یا Client-side sharding Client-side sharding (مانند ketama)
مولتی‌تریدینگ اصلی (۶.۰+) + I/O threads (مدل hybrid) کاملاً مولتی‌ترید از ابتدا (عملکرد بسیار خوب در هسته‌های زیاد)
موارد استفاده معمول کش، پیام‌رسان، صف، قفل توزیع، رتبه‌بندی، Session Store، پایگاه داده سریع کش خالص (مثل کش DB، کش API، کاهش بار پایگاه داده)

تفاوت Redis و MongoDB

مقایسه Redis و MongoDB کمی متفاوت از مقایسه Redis و Memcached است، چون این دو اساساً برای اهداف متفاوتی طراحی شده‌اند.

ویژگی Redis MangoDB
نوع دیتابیس In-Memory Database / Cache NoSQL Document Database
محل اصلی ذخیره داده RAM Disk
سرعت بسیار سریع (معمولاً زیر ۱ میلی‌ثانیه) سریع، اما کندتر از Redis
ماندگاری داده اختیاری دائمی و اصلی
حجم داده محدود به RAM سرور محدود به فضای دیسک
ساختار داده String، Hash، List، Set و… Documentهای JSON/BSON
Queryهای پیچیده محدود بسیار قدرتمند
Aggregation (تجمیع داده‌ها) محدود پیشرفته
Indexing ساده پیشرفته
موارد استفاده کش، نشست (session)، صف، پیام‌رسان، قفل توزیع، رتبه‌بندی، ذخیره داده‌های سریع بانک اطلاعاتی اصلی (OLTP)، سیستم‌های محتوایی، داده‌های نیمه‌ساختاریافته، آرشیو، تحلیل جمعی

جمع‌بندی

Redis با ذخیره‌سازی در RAM، معماری تک‌رشته‌ای و ساختارهای داده‌ی بهینه، یکی از سریع‌ترین پایگاه‌داده‌های موجود است. ردیس ابزاری است که GitHub، Stack Overflow و Pinterest برای مدیریت ترافیک سنگین به آن تکیه می‌کنند.

اما Redis جایگزین پایگاه‌داده‌ اصلی شما نیست. اگر نیاز به query های پیچیده، روابط چندجانبه یا ذخیره‌سازی دائمی حجم بالایی از داده دارید، PostgreSQL یا MongoDB گزینه‌های بهتری هستند. Redis بهترین عملکرد را زمانی دارد که در کنار این پایگاه‌داده‌ها قرار می‌گیرد، نه به‌جای آن‌ها.

یک قانون ساده برای تصمیم‌گیری: اگر داده‌ای پرتکرار، موقت یا نیازمند پاسخ‌دهی آنی است از Redis استفاده کنید. اگر داده‌ای دائمی، رابطه‌ای یا نیازمند تحلیل پیچیده است، از پایگاه‌داده‌ی سنتی.

در دنیایی که کاربران کمتر از سه ثانیه صبر می‌کنند، Redis دیگر یک انتخاب اختیاری نیست — یک ضرورت است.

نظر شما راجع به این محتوا چیست؟

عضویت در خبرنامه لیموهاست

در خبرنامه ما عضو شوید تا مطالب جدید جا نمونید.

دیدگاه ها

اولین نفری باشید که دیدگاه خود را ثبت می کنید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *