استخدامات Redis: التخزين المؤقت وقوائم الانتظار وتحديد المعدل

Backend2026-10-03TryQuickToolBox

لقد قمت ببناء تطبيق ويب يعمل، ولكن مع نمو حركة المرور، تلاحظ بطء تحميل الصفحات، واختناقات قاعدة البيانات، وتوقفًا عرضيًا. هذه آلام شائعة عند التوسع. يمكن لـ Redis، وهو مخزن بيانات في الذاكرة، حل العديد من هذه المشكلات بأناقة. في هذه المقالة، سنستكشف ثلاثة استخدامات عملية لـ Redis: التخزين المؤقت، وقوائم الانتظار، وتحديد المعدل. ستتعلم كيفية تنفيذ كل منها مع أمثلة برمجية وأفضل الممارسات.

لماذا Redis؟

Redis هو مخزن مفتوح المصدر للقيم والمفاتيح في الذاكرة، معروف بسرعته وتعدد استخداماته. يدعم هياكل البيانات مثل السلاسل النصية، والقوائم، والمجموعات، والتجزئات، والمجموعات المرتبة، مما يجعله مناسبًا لمجموعة واسعة من المهام. نظرًا لأنه يحتفظ بالبيانات في الذاكرة، فإن عمليات القراءة والكتابة سريعة للغاية - غالبًا أقل من مللي ثانية. بينما ليس بديلاً لقاعدة البيانات الأساسية، فإنه يتفوق كأداة تكميلية للأداء والتنسيق.

1. التخزين المؤقت باستخدام Redis

التخزين المؤقت هو الاستخدام الأكثر شيوعًا لـ Redis. من خلال تخزين البيانات التي يتم الوصول إليها بشكل متكرر في Redis، يمكنك تقليل الحمل على قاعدة البيانات الأساسية وتسريع الاستجابات.

كيفية تنفيذ التخزين المؤقت

  1. تحقق من Redis أولاً: عند وصول طلب، ابحث عن البيانات في Redis باستخدام مفتاح فريد.
  2. عند فقدان ذاكرة التخزين المؤقت: إذا لم تكن البيانات موجودة في Redis، اجلبها من قاعدة البيانات.
  3. تخزين في Redis: احفظ النتيجة في Redis مع وقت انتهاء الصلاحية (TTL) لتجنب البيانات القديمة.
  4. إرجاع البيانات: أرسل البيانات إلى العميل.

إليك مثال بسيط في 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

أفضل الممارسات:

2. قوائم الانتظار باستخدام Redis

قوائم وتدفقات Redis مثالية لبناء قوائم انتظار بسيطة للرسائل. تسمح لك بفصل المهام التي تستهلك وقتًا (مثل إرسال رسائل البريد الإلكتروني أو معالجة الصور) عن تدفق الطلبات الرئيسي، مما يحسن الاستجابة.

استخدام القوائم كقوائم انتظار

تدعم قوائم Redis عمليات الدفع والسحب الذرية. استخدم LPUSH لإضافة المهام إلى اليسار وBRPOP للحظر والسحب من اليمين، مما ينشئ قائمة انتظار FIFO.

# Producer: add a job
r.lpush('job_queue', json.dumps({'task': 'send_email', 'to': 'user@example.com'}))

# Consumer: process jobs
while True:
    _, job_data = r.brpop('job_queue', timeout=30)
    job = json.loads(job_data)
    process_job(job)

اعتبارات:

3. تحديد المعدل باستخدام Redis

يحمي تحديد المعدل واجهة برمجة التطبيقات الخاصة بك من سوء الاستخدام ويضمن الاستخدام العادل. عمليات Redis الذرية وانتهاء الصلاحية تجعله مثاليًا لتنفيذ محددات المعدل.

تحديد المعدل بنافذة ثابتة

في نافذة ثابتة، تسمح بـ N طلب لكل نافذة زمنية (مثل 100 طلب في الساعة). استخدم INCR وEXPIRE لتتبع الأعداد.

def is_rate_limited(user_id, limit=100, window=3600):
    key = f"rate:{user_id}"
    current = r.incr(key)
    if current == 1:
        r.expire(key, window)
    return current > limit

النافذة المنزلقة مع المجموعات المرتبة توفر تحديدًا أكثر سلاسة. قم بتخزين الطوابع الزمنية للطلبات في مجموعة مرتبة وإزالة الإدخالات القديمة.

def is_rate_limited_sliding(user_id, limit=100, window=3600):
    key = f"rate:{user_id}"
    now = time.time()
    pipeline = r.pipeline()
    pipeline.zremrangebyscore(key, 0, now - window)
    pipeline.zadd(key, {now: now})
    pipeline.zcard(key)
    pipeline.expire(key, window)
    _, _, count, _ = pipeline.execute()
    return count > limit

أفضل الممارسات:

مقارنة حالات الاستخدام

حالة الاستخدام هيكل بيانات Redis الفائدة الرئيسية
التخزين المؤقت String, Hash تقليل حمل قاعدة البيانات، قراءات أسرع
قوائم الانتظار List, Stream فصل المهام، تحسين الاستجابة
تحديد المعدل String, Sorted Set حماية واجهات API، ضمان الاستخدام العادل

الأسئلة الشائعة

هل Redis دائم؟

يقدم Redis الاستمرارية من خلال لقطات RDB وسجلات AOF، لكنه في الأساس مخزن في الذاكرة. للبيانات الحرجة، احتفظ دائمًا بنسخة احتياطية أو استخدم قاعدة بيانات أساسية.

هل يمكنني استخدام Redis لتخزين الجلسات؟

نعم، يُستخدم Redis بشكل شائع لتخزين الجلسات بسبب سرعته وانتهاء الصلاحية التلقائي. يسمح لك بمشاركة الجلسات عبر خوادم متعددة.

ماذا يحدث إذا تعطل Redis؟

إذا كان Redis غير متاح، يجب أن يعود تطبيقك بأمان إلى قاعدة البيانات أو إرجاع البيانات المخزنة مؤقتًا من ذاكرة تخزين محلية. قم بتنفيذ قواطع الدائرة لتجنب الفشل المتتالي.

هل أنت مستعد لتحسين تطبيق الويب الخاص بك؟ ابدأ بدمج Redis للتخزين المؤقت، أو قوائم الانتظار، أو تحديد المعدل. للمهام السريعة مثل تنسيق JSON أو تحليل السجلات، تحقق من JSON Formatter وNginx Log Analyzer.