Redis: النشر/الاشتراك في Redis
النشر/الاشتراك (Pub/Sub) هو نمط اتصال للرسائل. يغطي هذا الدرس وظيفة النشر/الاشتراك في Redis.
1. ما هو النشر/الاشتراك؟
يتكون نمط النشر/الاشتراك من:
- الناشر: يرسل رسائل إلى قناة
- المشترك: يستقبل رسائل من قناة
- القناة: ناقل الرسائل
BASH
الناشر → قناة → مشترك 1
→ مشترك 2
→ مشترك 3
2. الأوامر الأساسية
(1) SUBSCRIBE: الاشتراك في قناة
REDIS
# الاشتراك في قناة واحدة
SUBSCRIBE channel1
# الاشتراك في قنوات متعددة
SUBSCRIBE channel1 channel2 channel3
بعد الاشتراك، يدخل العميل في حالة انتظار لاستقبال الرسائل.
(2) PUBLISH: نشر رسالة
REDIS
# نشر رسالة إلى قناة
PUBLISH channel1 "Hello, Redis!"
(integer) 2 # يُرجع عدد المشتركين الذين استلموا الرسالة
(3) UNSUBSCRIBE: إلغاء الاشتراك
REDIS
# إلغاء الاشتراك من جميع القنوات
UNSUBSCRIBE
# إلغاء الاشتراك من قناة محددة
UNSUBSCRIBE channel1
3. الاشتراك بالنمط
(1) PSUBSCRIBE: اشتراك مطابق للنمط
REDIS
# الاشتراك في القنوات المطابقة لنمط
PSUBSCRIBE news.* # الاشتراك في جميع القنوات التي تبدأ بـ news.
# مثال
PSUBSCRIBE user:*:notifications # الاشتراك في جميع قنوات إشعارات المستخدمين
(2) PUNSUBSCRIBE: إلغاء الاشتراك بالنمط
REDIS
# إلغاء جميع اشتراكات الأنماط
PUNSUBSCRIBE
# إلغاء اشتراك نمط محدد
PUNSUBSCRIBE news.*
4. حالات الاستخدام
(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"
5. تنسيق الرسالة
تنسيق الرسالة الذي يستلمه المشتركون:
TEXT
📖 للعرض فقط
1) "message" # نوع الرسالة
2) "channel1" # اسم القناة
3) "Hello, Redis!" # محتوى الرسالة
تنسيق رسالة الاشتراك بالنمط:
TEXT
📖 للعرض فقط
1) "pmessage" # نوع الرسالة
2) "news.*" # النمط المشترك
3) "news:sports" # اسم القناة الفعلي
4) "Game result!" # محتوى الرسالة
6. ملاحظات مهمة
⚠️ الرسائل غير محفوظة: رسائل النشر/الاشتراك غير مخزنة. المشتركون يستلمون فقط الرسائل المرسلة بعد اشتراكهم.
⚠️ فقدان الرسائل: إذا انقطع اتصال مشترك، تُفقد الرسائل المرسلة خلال تلك الفترة.
💡 بديل: عندما تكون هناك حاجة لحفظ الرسائل، استخدم Redis Streams أو القوائم لقوائم انتظار الرسائل.
7. 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 >
(1) 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 لتنفيذ قائمة انتظار رسائل بسيطة
8. الدرس التالي
في الدرس التالي، سنتعلم معاملات Redis، والتي تغطي استخدام المعاملات والتحذيرات.