Redis والتخزين المؤقت المتقدم

مقدمة إلى Redis

20 دقيقة الدرس 2 من 30

ما هو Redis؟

Redis (خادم القاموس البعيد - Remote Dictionary Server) هو مخزن بنية بيانات مفتوح المصدر في الذاكرة يمكن استخدامه كقاعدة بيانات وذاكرة تخزين مؤقت ووسيط رسائل ومحرك تدفق. يدعم بنيات بيانات متنوعة مثل السلاسل النصية والهاشات والقوائم والمجموعات والمجموعات المرتبة والخرائط البتية والهايبرلوج لوجز والفهارس الجغرافية المكانية.

ميزة أساسية: يقوم Redis بتخزين جميع البيانات في ذاكرة الوصول العشوائي (RAM)، مما يجعله سريعاً للغاية - قادر على التعامل مع ملايين العمليات في الثانية مع زمن وصول أقل من ميلي ثانية.

مخزن البيانات في الذاكرة

على عكس قواعد البيانات التقليدية التي تخزن البيانات على القرص، يحتفظ Redis بكل شيء في الذاكرة. يوفر هذا الاختيار الأساسي للتصميم:

  • السرعة: الوصول إلى ذاكرة الوصول العشوائي أسرع بحوالي 100,000 مرة من الوصول إلى القرص
  • البساطة: نموذج مفتاح-قيمة بسيط مع بنيات بيانات غنية
  • العمليات الذرية: جميع عمليات Redis ذرية افتراضياً
  • خيارات الثبات: يمكن حفظ لقطات على القرص للمتانة
// مقارنة السرعة\nالوصول إلى القرص: ~10ms (10,000 ميكروثانية)\nالوصول إلى SSD: ~0.1ms (100 ميكروثانية)\nالوصول إلى RAM: ~0.0001ms (0.1 ميكروثانية)\n\nيمكن لـ Redis إجراء أكثر من 100,000 عملية في الثانية على عتاد متواضع!

Redis مقابل Memcached

كلاهما حلول تخزين مؤقت في الذاكرة شائعة، لكن Redis يقدم ميزات أكثر بكثير:

الميزةRedisMemcached
بنيات البياناتالسلاسل، القوائم، المجموعات، الهاشات، المجموعات المرتبة، إلخ.السلاسل فقط
الثباتلقطات RDB، سجلات AOFلا شيء
النسخ المتماثلنسخ متماثل رئيسي-تابعلا شيء
التجميعمجموعة Redis مدمجةتجزئة جانب العميل
النشر/الاشتراكنعملا
برمجة Lua النصيةنعملا
متى تستخدم Redis: اختر Redis لبنيات البيانات الغنية والثبات وميزات النشر/الاشتراك. اختر Memcached فقط إذا كنت بحاجة إلى تخزين مؤقت بسيط للسلاسل مع خيوط متعددة.

حالات استخدام Redis

يتفوق Redis في العديد من السيناريوهات بعيداً عن التخزين المؤقت البسيط:

  1. تخزين الجلسات: تخزين جلسات المستخدم مع انتهاء صلاحية تلقائي
  2. التحليلات في الوقت الفعلي: عد مشاهدات الصفحة والنقرات والأحداث في الوقت الفعلي
  3. لوحات المتصدرين: استخدام المجموعات المرتبة لنقاط الألعاب والتصنيفات
  4. تحديد المعدل: تتبع طلبات API لكل مستخدم/IP مع العدادات
  5. أنظمة قوائم الانتظار: قوائم انتظار الوظائف باستخدام القوائم (يمكن لقوائم انتظار Laravel استخدام Redis)
  6. رسائل النشر/الاشتراك: الدردشة في الوقت الفعلي والإشعارات والبث
  7. البيانات الجغرافية المكانية: تخزين واستعلام البيانات القائمة على الموقع
  8. التخزين المؤقت للصفحة الكاملة: تخزين صفحات HTML بأكملها للتسليم فائق السرعة
// تكوين جلسة Laravel باستخدام Redis\n// config/session.php\n'driver' => 'redis',\n'connection' => 'session',\n\n// تكوين قائمة انتظار Laravel باستخدام Redis\n// config/queue.php\n'default' => 'redis',

تثبيت Redis

يختلف تثبيت Redis حسب نظام التشغيل:

// Ubuntu/Debian\nsudo apt update\nsudo apt install redis-server\nsudo systemctl start redis-server\nsudo systemctl enable redis-server\n\n// macOS (باستخدام Homebrew)\nbrew install redis\nbrew services start redis\n\n// Windows (باستخدام WSL أو Docker)\ndocker run -d -p 6379:6379 --name redis redis:latest\n\n// التحقق من التثبيت\nredis-cli ping\n// يجب أن يرجع: PONG
المنفذ الافتراضي: يعمل Redis على المنفذ 6379 افتراضياً. يستمع الخادم على localhost (127.0.0.1) ولا يتطلب مصادقة في التكوين الافتراضي (غير هذا في الإنتاج!).

أساسيات Redis CLI

redis-cli (واجهة سطر الأوامر) هي الأداة الأساسية للتفاعل مع Redis:

// بدء redis-cli\nredis-cli\n\n// الأوامر الأساسية\n127.0.0.1:6379> SET mykey "Hello Redis"\nOK\n\n127.0.0.1:6379> GET mykey\n"Hello Redis"\n\n127.0.0.1:6379> EXISTS mykey\n(integer) 1\n\n127.0.0.1:6379> DEL mykey\n(integer) 1\n\n127.0.0.1:6379> GET mykey\n(nil)\n\n// التحقق من معلومات الخادم\n127.0.0.1:6379> INFO\n// يعيد إحصائيات الخادم التفصيلية\n\n// الخروج من redis-cli\n127.0.0.1:6379> QUIT

نموذج بيانات Redis

Redis هو أساساً مخزن مفتاح-قيمة حيث:

  • المفاتيح: سلاسل آمنة ثنائياً (يمكن أن تحتوي على أي بيانات، الحد الأقصى 512 ميجابايت)
  • القيم: واحدة من عدة بنيات بيانات (سلاسل، قوائم، مجموعات، إلخ.)
  • مساحة الأسماء: استخدم النقطتين للمفاتيح الهرمية: user:1000:sessions
// اصطلاحات تسمية المفاتيح (أفضل الممارسات)\nuser:1000:profile // بيانات ملف تعريف المستخدم\nuser:1000:sessions // جلسات المستخدم\nproduct:5000:views // عدد مشاهدات المنتج\ncache:homepage:en // الصفحة الرئيسية المخزنة مؤقتاً (الإنجليزية)\nqueue:emails:pending // قائمة انتظار البريد الإلكتروني\nrate_limit:api:192.168.1.1 // حد المعدل لعنوان IP
تصميم المفاتيح: استخدم أسماء مفاتيح وصفية وهرمية مع نقطتين. قم بتضمين نوع الكائن والمعرف والسمة للوضوح. مثال: object:id:attribute

ثبات Redis

بينما Redis هي قاعدة بيانات في الذاكرة، فإنها توفر آليتي ثبات:

1. لقطات RDB (قاعدة بيانات Redis)

لقطات لحظية لمجموعة بياناتك في فترات محددة. سريعة ومدمجة.

// تكوين RDB في redis.conf\nsave 900 1 // الحفظ إذا تغير مفتاح واحد في 900 ثانية\nsave 300 10 // الحفظ إذا تغيرت 10 مفاتيح في 300 ثانية\nsave 60 10000 // الحفظ إذا تغيرت 10000 مفتاح في 60 ثانية

2. AOF (ملف الإلحاق فقط)

تسجل كل عملية كتابة. أكثر متانة ولكن أبطأ وملفات أكبر.

// تكوين AOF في redis.conf\nappendonly yes\nappendfsync everysec // المزامنة مع القرص كل ثانية
المتانة مقابل السرعة: يأتي الثبات بتكلفة أداء. للتخزين المؤقت النقي (حيث فقدان البيانات مقبول)، قم بتعطيل الثبات. للبيانات الحرجة، قم بتمكين AOF مع fsync.

أساسيات أمان Redis

افتراضياً، لا يحتوي Redis على مصادقة. لبيئات الإنتاج:

// تعيين كلمة المرور في redis.conf\nrequirepass your_strong_password_here\n\n// الربط بواجهة محددة (لا تعرض للإنترنت!)\nbind 127.0.0.1\n\n// إعادة تسمية الأوامر الخطرة\nrename-command FLUSHDB ""\nrename-command FLUSHALL ""\nrename-command CONFIG "CONFIG_abc123"

تثبيت امتداد Redis PHP

لاستخدام Redis مع PHP/Laravel، قم بتثبيت امتداد PHP Redis أو استخدم Predis:

// الخيار 1: PhpRedis (أسرع، امتداد C)\nsudo pecl install redis\n// إضافة إلى php.ini: extension=redis.so\n\n// الخيار 2: Predis (PHP نقي، بدون تجميع)\ncomposer require predis/predis\n\n// تكوين Laravel (config/database.php)\n'redis' => [\n 'client' => env('REDIS_CLIENT', 'phpredis'),\n 'default' => [\n 'host' => env('REDIS_HOST', '127.0.0.1'),\n 'password' => env('REDIS_PASSWORD', null),\n 'port' => env('REDIS_PORT', 6379),\n 'database' => 0,\n ],\n];
تمرين: قم بتثبيت Redis على جهاز التطوير الخاص بك وأكمل هذه المهام:
  1. ابدأ خادم Redis واتصل بـ redis-cli
  2. نفذ أمر PING للتحقق من الاتصال
  3. قم بتعيين مفتاح "myname" باسمك كقيمة
  4. استرجع القيمة باستخدام GET
  5. احذف المفتاح وأكد أنه اختفى
  6. قم بتشغيل أمر INFO ولاحظ إصدار Redis

في الدرس التالي، سنستكشف سلاسل Redis - نوع البيانات الأساسي والأكثر تنوعاً في Redis.