Redis: إعداد الكاش لتسريع تطبيقك

Redis يخزّن البيانات المتكررة في الذاكرة. يسرّع تطبيقك 10-100 مرة. نشرح التثبيت والإعداد مع Laravel.
ما هو Redis ولماذا تحتاجه؟
Redis هو نظام تخزين بيانات في الذاكرة (in-memory data store) يعمل كقاعدة بيانات سريعة للغاية وخدمة cache وسطاء رسائل. استجابته تقاس بالميكروثانية مقارنة بالمللي ثانية لقواعد البيانات التقليدية.
لماذا Redis تحديداً؟
- سرعة قصوى: يعالج أكثر من مليون عملية في الثانية
- أنواع بيانات متعددة: strings، lists، sets، hashes، sorted sets
- TTL مدمج: انتهاء صلاحية تلقائي للبيانات
- Pub/Sub: نظام رسائل مدمج
- Persistence اختياري: حفظ البيانات على القرص
التثبيت على Ubuntu
# تحديث النظام
apt update && apt upgrade -y
# تثبيت Redis
apt install redis-server -y
# تشغيل وتفعيل عند الإقلاع
systemctl start redis-server
systemctl enable redis-server
# التحقق من التثبيت
redis-cli ping
# PONG
# عرض معلومات السيرفر
redis-cli info server
الإعداد الأساسي
nano /etc/redis/redis.conf
# حد الذاكرة (50% من RAM السيرفر كقاعدة)
maxmemory 2gb
# سياسة حذف البيانات عند امتلاء الذاكرة
maxmemory-policy allkeys-lru
# الاستماع على localhost فقط (أكثر أماناً)
bind 127.0.0.1
# كلمة مرور (اختياري لكن موصى به)
requirepass your_strong_password_here
# حفظ البيانات (للـ persistence)
save 900 1
save 300 10
save 60 10000
# إعادة تشغيل بعد التعديل
systemctl restart redis-server
التكامل مع Laravel
# تثبيت مكتبة predis
composer require predis/predis
# أو استخدام phpredis (أسرع)
pecl install redis
echo "extension=redis.so" >> /etc/php/8.2/fpm/conf.d/redis.ini
# .env
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=your_strong_password_here
REDIS_PORT=6379
استراتيجيات الـ Cache
Cache Aside (الأكثر شيوعاً)
// التطبيق يتحقق من الـ cache أولاً
$product = Cache::remember("product:{$id}", 3600, function use ($id) {
return Product::with('category', 'images')->find($id);
});
Cache Tags (للبيانات المترابطة)
// تخزين مجموعة بيانات تحت tag واحد
Cache::tags(['products', 'category:electronics'])->put(
"product:{$id}",
$product,
3600
);
// مسح كل cache المتعلق بالمنتجات دفعة واحدة
Cache::tags(['products'])->flush;
Cache بيانات الجلسة
// config/session.php
'driver' => env('SESSION_DRIVER', 'redis'),
'lifetime' => 120,
// هذا يخفف الضغط الكبير عن قاعدة البيانات
// لأن session reads كثيرة جداً في كل طلب
Redis كـ Queue Driver
// config/queue.php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
// dispatch job
SendWelcomeEmail::dispatch($user)->onQueue('emails');
// تشغيل worker
php artisan queue:work redis --queue=emails --tries=3
Redis Pub/Sub للإشعارات الفورية
// Subscriber (يستمع)
Redis::subscribe(['notifications'], function (string $message) {
$data = json_decode($message, true);
// معالجة الإشعار
});
// Publisher (يرسل)
Redis::publish('notifications', json_encode([
'user_id' => 123,
'message' => 'خادمك جاهز',
'type' => 'server_ready',
]));
مراقبة Redis
# مراقبة في الوقت الفعلي
redis-cli monitor
# إحصائيات مفصلة
redis-cli info stats
# معدل hit/miss الـ cache
redis-cli info stats | grep -E "keyspace_hits|keyspace_misses"
# عرض جميع المفاتيح (في dev فقط)
redis-cli keys "*"
# حجم قيمة معينة
redis-cli debug object "cache:product:123"
مقاييس مهمة للمراقبة
| المقياس | الهدف | التدخل |
|---|---|---|
| Hit Rate | > 90% | راجع استراتيجية الـ cache |
| Memory Usage | < 80% | رفع maxmemory أو ترقية السيرفر |
| Connected Clients | < 500 | فعّل connection pooling |
| Evicted Keys | يجب 0 | رفع maxmemory |
نقاط المقارنة (Redis vs Memcached)
| الميزة | Redis | Memcached |
|---|---|---|
| أنواع البيانات | متعددة | strings فقط |
| Persistence | نعم | لا |
| Pub/Sub | نعم | لا |
| Clustering | نعم | محدود |
| الاستخدام الشائع | cache + queue + session | cache فقط |
التوصية: استخدم Redis دائماً. لا سبب للاختيار Memcached في المشاريع الجديدة.
على سيرفرات كلاود
سيرفرات كلاود (cloud.net.sa) تعتمد SSD NVMe ومعالجات حديثة، مما يجعل Redis يعمل بأقصى كفاءة. عند إعداد تطبيقك، يمكنك تخصيص 25-50% من RAM للـ Redis و50-75% للتطبيق نفسه. مع خيار إضافة RAM بـ 600 ريال لكل 2GB، يمكنك التوسع بسهولة.
خلاصة
Redis ليس اختياراً — هو ضرورة لأي تطبيق جاد. تثبيته يأخذ 10 دقائق، والتكامل مع Laravel يأخذ 30 دقيقة. الأثر على الأداء فوري: زمن استجابة أسرع، ضغط أقل على قاعدة البيانات، وتطبيق يتحمل أضعاف الزيارات بنفس الموارد.
