استخدامات Redis: التخزين المؤقت، الطوابير، وتحديد المعدل
لقد قمت ببناء تطبيق ويب يكتسب زخماً، ولكن الآن كل تحميل صفحة يضرب قاعدة البيانات، والمهام الخلفية تتراكم، وبعض المستخدمين يضغطون على واجهة برمجة التطبيقات الخاصة بك. تحتاج إلى مخزن بيانات سريع في الذاكرة للتعامل مع هذه التحديات. Redis هو الحل الأمثل للتخزين المؤقت، والطوابير، وتحديد المعدل. في هذه المقالة، سنستكشف هذه الاستخدامات الثلاثة الأساسية مع أمثلة عملية وأفضل الممارسات.
لماذا Redis للتخزين المؤقت والطوابير وتحديد المعدل؟
Redis هو مخزن مفتاح-قيمة في الذاكرة معروف بسرعته وتعدد استخداماته. يدعم هياكل بيانات غنية مثل السلاسل، والقوائم، والمجموعات، والمجموعات المرتبة، والتجزئات، مما يجعله مثالياً لمهام متنوعة. عملياته الذرية وقدرات النشر/الاشتراك تزيد من فائدته. سواء كنت تقلل حمل قاعدة البيانات، أو تفصل الخدمات، أو تحمي واجهات برمجة التطبيقات، يقدم Redis مجموعة أدوات بسيطة لكنها قوية.
1. التخزين المؤقت باستخدام Redis
التخزين المؤقت هو الاستخدام الأكثر شيوعاً لـ Redis. من خلال تخزين البيانات التي يتم الوصول إليها بشكل متكرر في الذاكرة، تقلل زمن الاستجابة وحمل قاعدة البيانات. ميزة TTL (الوقت حتى انتهاء الصلاحية) في Redis تنتهي صلاحية البيانات القديمة تلقائياً.
كيفية تنفيذ التخزين المؤقت
- تحقق من ذاكرة التخزين المؤقت: قبل الاستعلام من قاعدة البيانات، تحقق مما إذا كانت البيانات موجودة في Redis.
- عند فقدان ذاكرة التخزين المؤقت: اجلب من قاعدة البيانات وخزن النتيجة في Redis مع وقت انتهاء الصلاحية.
- عند إصابة ذاكرة التخزين المؤقت: أعد البيانات المخزنة مؤقتاً مباشرة.
إليك مثالاً بلغة Python باستخدام redis-py:
import redis
import json
r = redis.Redis(host='localhost', port=6379, db=0)
def get_user(user_id):
cache_key = f"user:{user_id}"
cached = r.get(cache_key)
if cached:
return json.loads(cached)
# Simulate DB fetch
user = fetch_user_from_db(user_id)
r.setex(cache_key, 3600, json.dumps(user)) # Cache for 1 hour
return user
أفضل الممارسات للتخزين المؤقت
- اضبط TTLs مناسبة: وازن بين الحداثة ومعدل الإصابة. TTLs قصيرة للبيانات المتغيرة، وأطول للمحتوى الثابت.
- استخدم إبطال ذاكرة التخزين المؤقت: عند تغيير البيانات، احذف أو حدّث مفتاح ذاكرة التخزين المؤقت لتجنب القراءات القديمة.
- تعامل مع تدافع ذاكرة التخزين المؤقت: استخدم الأقفال أو انتهاء الصلاحية المبكر الاحتمالي لمنع العديد من الطلبات من ضرب قاعدة البيانات في وقت واحد عند فقدان ذاكرة التخزين المؤقت.
- راقب معدل الإصابة: استهدف نسبة إصابة عالية (على سبيل المثال، >80%) لضمان فعالية التخزين المؤقت.
2. الطوابير باستخدام Redis
تمكّن قوائم Redis والمجموعات المرتبة طوابير رسائل بسيطة لكنها قوية. إنها مثالية للمهام الخلفية، وطوابير المهام، ومعالجة الأحداث. على عكس وسطاء الرسائل المخصصين، طوابير Redis خفيفة الوزن وسهلة الإعداد.
تنفيذ طابور أساسي
استخدم LPUSH لإضافة المهام و BRPOP لاستهلاكها بطريقة حظر:
# Producer
r.lpush('job_queue', json.dumps({'task': 'send_email', 'to': 'user@example.com'}))
# Consumer
while True:
_, job = r.brpop('job_queue', timeout=30)
if job:
process_job(json.loads(job))
طوابير متقدمة باستخدام المجموعات المرتبة
للمهام المؤجلة أو طوابير الأولوية، استخدم المجموعات المرتبة مع الطوابع الزمنية كعلامات. يجلب المستهلكون المهام مع العلامات