النشر/الاشتراك في 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 أو القوائم لحفظ الرسائل。
س كم عدد المشتركين الذين يمكن أن تستوعبهم قناة؟
ج نظريًا غير محدود — يعتمد على أداء الخادم。

📖 ملخص

📝 تمارين

  1. تمرين الاشتراك: استخدم طرفيتين — أحدهما يشترك والآخر ينشر
  2. الاشتراك بالنمط: استخدم PSUBSCRIBE للاشتراك في قنوات متعددة متطابقة
  3. تمرين Stream: استخدم XADD/XREAD لتنفيذ قائمة انتظار رسائل بسيطة

الدرس التالي

في الدرس التالي، سنتعلم معاملات Redis، والتي تغطي استخدام المعاملات والتحذيرات.

100%