Redis یا ردیس یک Data Store سریع و عمدتاً مبتنی بر حافظه است که برای کشینگ، شمارنده، صف، Pub/Sub و نگهداری ساختارهای داده استفاده می‌شود. Redis فقط «کش» نیست، اما بسیاری از پروژه‌ها از آن به عنوان کش اشتراکی بهره می‌برند.

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

ساختارسناریو
Stringکش پاسخ، نرخ درخواست
Hashفیلدهای پروفایل
Listصف ساده
Setبرچسب‌های یکتا
Sorted Setرتبه‌بندی
Streamجریان پیام و Consumer Group

دستورات پرکاربرد Redis CLI

دستورکاربردمثال
PINGبررسی اتصالPING
SETذخیره مقدار و TTLSET cart:42 "3" EX 120
GETخواندن مقدارGET cart:42
DELحذف کلیدDEL cart:42
EXISTSبررسی وجود کلیدEXISTS cart:42
EXPIREاعمال مدت اعتبارEXPIRE cart:42 300
TTLزمان باقی‌مانده تا انقضاTTL cart:42
INCRافزایش اتمیک شمارندهINCR views:product:42
DECRکاهش شمارندهDECR stock:sku:2
MGETخواندن چند کلیدMGET key:1 key:2
MSETثبت چند مقدارMSET a 1 b 2
HSETثبت فیلد هشHSET user:42 name "Sam"
HGETALLخواندن فیلدهای هشHGETALL user:42
LPUSHافزودن به لیست از ابتداLPUSH jobs "task1"
RPOPخارج کردن از انتهای لیستRPOP jobs
SADDافزودن به SetSADD tags:42 php
SMEMBERSنمایش اعضای SetSMEMBERS tags:42
ZADDافزودن به Sorted SetZADD leaderboard 25 user:42
ZRANGEخواندن اعضا در ترتیبZRANGE leaderboard 0 -1
XADDافزودن رخداد به StreamXADD orders * order_id 42
XREADخواندن رخداد StreamXREAD COUNT 5 STREAMS orders 0
SCANپیمایش تدریجی کلیدهاSCAN 0 MATCH cart:* COUNT 100
INFOمشاهده آمار سرویسINFO memory
DBSIZEشمارش کلیدهای DB انتخابیDBSIZE
TYPEنوع داده یک کلیدTYPE cart:42
PERSISTحذف زمان انقضاPERSIST cart:42

روش اجرا و چند مثال

redis-cli PING
redis-cli SET product:42 "in-stock" EX 120
redis-cli GET product:42
redis-cli INCR views:product:42
redis-cli SCAN 0 MATCH product:* COUNT 100
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set('product:42', 'active', ex=120)
print(r.get('product:42'))
// Laravel, when the Redis connection is configured
Redis::setex('product:42', 120, 'active');
$status = Redis::get('product:42');

ردیس در مقایسه با پایگاه داده و بروکر پیام

برای داده دائمی و رابطه‌های پیچیده معمولاً دیتابیس اصلی را با ردیس جایگزین نمی‌کنیم. برای صف‌های پیچیده باید نیاز به Ack، Retry، Consumer Group و تضمین تحویل مشخص شود. Redis Streams با List تفاوت دارد و Kafka برای ذخیره رخدادهای پایدار و پخش مجدد در مقیاس بزرگ طراحی متفاوتی دارد.

نکته فنی

KEYS روی فضای کلید بزرگ می‌تواند مسدودکننده باشد. در محیط عملیاتی از SCAN استفاده کنید. از دستور FLUSHALL روی داده واقعی استفاده نکنید.

اصطلاحات مرتبط: کشینگ، کش استمپید، صف، مسیج بروکر، دیستریبیوتد لاک، ریت لیمیتر.