النشر/الاشتراك في Redis
النشر/الاشتراك (Pub/Sub) هو نمط اتصال للرسائل. يغطي هذا الدرس وظيفة النشر/الاشتراك في Redis.
ما هو النشر/الاشتراك؟
يتكون نمط النشر/الاشتراك من:
- الناشر: يرسل رسائل إلى قناة
- المشترك: يستقبل رسائل من قناة
- القناة: ناقل الرسائل
الناشر → قناة → مشترك 1
→ مشترك 2
→ مشترك 3
الأوامر الأساسية
SUBSCRIBE: الاشتراك في قناة
REDIS
# الاشتراك في قناة واحدة
SUBSCRIBE channel1
# الاشتراك في قنوات متعددة
SUBSCRIBE channel1 channel2 channel3
بعد الاشتراك، يدخل العميل في حالة انتظار لاستقبال الرسائل.
PUBLISH: نشر رسالة
REDIS
# نشر رسالة إلى قناة
PUBLISH channel1 "Hello, Redis!"
(integer) 2 # يُرجع عدد المشتركين الذين استلموا الرسالة
UNSUBSCRIBE: إلغاء الاشتراك
REDIS
# إلغاء الاشتراك من جميع القنوات
UNSUBSCRIBE
# إلغاء الاشتراك من قناة محددة
UNSUBSCRIBE channel1
الاشتراك بالنمط
PSUBSCRIBE: اشتراك مطابق للنمط
REDIS
# الاشتراك في القنوات المطابقة لنمط
PSUBSCRIBE news.* # الاشتراك في جميع القنوات التي تبدأ بـ news.
# مثال
PSUBSCRIBE user:*:notifications # الاشتراك في جميع قنوات إشعارات المستخدمين
PUNSUBSCRIBE: إلغاء الاشتراك بالنمط
REDIS
# إلغاء جميع اشتراكات الأنماط
PUNSUBSCRIBE
# إلغاء اشتراك نمط محدد
PUNSUBSCRIBE news.*
حالات الاستخدام
1. دفع الرسائل الفوري
مثال:إشعارات فورية
BASH
# الطرفية 1: الاشتراك في الإشعارات
SUBSCRIBE notifications
# الطرفية 2: نشر إشعار
PUBLISH notifications "New user registered"
2. غرفة الدردشة
مثال:غرفة الدردشة
BASH
# المستخدم 1: الاشتراك في غرفة الدردشة
SUBSCRIBE chatroom:general
# المستخدم 2: إرسال رسالة
PUBLISH chatroom:general "Hello everyone!"
3. إشعارات النظام
مثال:تنبيهات النظام
BASH
# المسؤول: الاشتراك في تنبيهات النظام
SUBSCRIBE system:alerts
# النظام: إرسال تنبيه
PUBLISH system:alerts "High CPU usage detected"
تنسيق الرسالة
تنسيق الرسالة الذي يستلمه المشتركون:
TEXT
1) "message" # نوع الرسالة
2) "channel1" # اسم القناة
3) "Hello, Redis!" # محتوى الرسالة
تنسيق رسالة الاشتراك بالنمط:
TEXT
1) "pmessage" # نوع الرسالة
2) "news.*" # النمط المشترك
3) "news:sports" # اسم القناة الفعلي
4) "Game result!" # محتوى الرسالة
ملاحظات مهمة
⚠️ الرسائل غير محفوظة: رسائل النشر/الاشتراك غير مخزنة. المشتركون يستلمون فقط الرسائل المرسلة بعد اشتراكهم.
⚠️ فقدان الرسائل: إذا انقطع اتصال مشترك، تُفقد الرسائل المرسلة خلال تلك الفترة.
💡 بديل: عندما تكون هناك حاجة لحفظ الرسائل، استخدم Redis Streams أو القوائم لقوائم انتظار الرسائل.
Redis Stream (موصى به)
تم تقديم Streams في Redis 5.0، وهو حل أفضل لقوائم انتظار الرسائل:
REDIS
# إضافة رسالة
XADD mystream * name "Alice" action "login"
"1638361451780-0"
# قراءة الرسائل
XREAD COUNT 1 STREAMS mystream 0
# مجموعات المستهلكين
XGROUP CREATE mystream mygroup 0
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >
Stream مقابل Pub/Sub
| الميزة | Pub/Sub | Stream |
|---|---|---|
| حفظ الرسائل | ❌ غير محفوظة | ✅ محفوظة |
| تأكيد الرسائل | ❌ لا يوجد ACK | ✅ ACK مدعوم |
| مجموعات المستهلكين | ❌ غير مدعومة | ✅ مدعومة |
| الرسائل التاريخية | ❌ لا يمكن استرجاعها | ✅ قابلة للاستعلام |
| حالة الاستخدام | إشعارات فورية | قوائم انتظار رسائل |
❓ أسئلة شائعة
س هل يتم تخزين رسائل Pub/Sub؟
ج لا. Pub/Sub هو "أطلق وانسَ" — الرسائل غير محفوظة。
س هل يمكن لمشترك منقطع الاتصال استلام الرسائل التاريخية؟
ج لا. استخدم Streams أو القوائم لحفظ الرسائل。
س كم عدد المشتركين الذين يمكن أن تستوعبهم قناة؟
ج نظريًا غير محدود — يعتمد على أداء الخادم。
📖 ملخص
- Pub/Sub يستخدم PUBLISH للنشر و SUBSCRIBE للاشتراك
- يدعم مطابقة الأنماط باستخدام PSUBSCRIBE
- الرسائل غير محفوظة، مناسبة للإشعارات الفورية
- لحفظ الرسائل، استخدم Redis Streams
- Streams تدعم مجموعات المستهلكين، تأكيد الرسائل، واستعلامات التاريخ
📝 تمارين
- تمرين الاشتراك: استخدم طرفيتين — أحدهما يشترك والآخر ينشر
- الاشتراك بالنمط: استخدم PSUBSCRIBE للاشتراك في قنوات متعددة متطابقة
- تمرين Stream: استخدم XADD/XREAD لتنفيذ قائمة انتظار رسائل بسيطة
الدرس التالي
في الدرس التالي، سنتعلم معاملات Redis، والتي تغطي استخدام المعاملات والتحذيرات.



