Redis: مجموعات Redis المرتبة (الجزء 1)

آخر تحديث: 2026-08-26

المجموعة المرتبة هي مجموعة مع درجات، حيث يتم ترتيب العناصر حسب الدرجة. يغطي هذا الدرس عمليات المجموعات المرتبة الأساسية.

1. ما هي المجموعة المرتبة؟

ميزات المجموعة المرتبة:

BASH
leaderboard
├─ "player1" → degree: 100
├─ "player2" → degree: 200
├─ "player3" → degree: 300
└─ "player4" → degree: 400
💡 التنفيذ الداخلي: تستخدم المجموعات المرتبة قائمة تخطي + جدول تجزئة. قائمة التخطي تدعم الفرز الفعال واستعلامات النطاق، بينما جدول التجزئة يتيح عمليات بحث سريعة عن الدرجات.


2. ZADD: إضافة عناصر

(1) الاستخدام الأساسي

REDIS
# إضافة عنصر واحد
ZADD leaderboard 100 "player1"
(integer) 1  # يُرجع عدد العناصر المضافة حديثًا

# إضافة عناصر متعددة
ZADD leaderboard 200 "player2" 300 "player3" 400 "player4"
(integer) 3

(2) معاملات ZADD

REDIS
# NX: إضافة عناصر جديدة فقط، لا تقم بتحديث العناصر الموجودة
ZADD leaderboard NX 150 "player1"
(integer) 0  # player1 موجود بالفعل، لم يتم التحديث

# XX: تحديث العناصر الموجودة فقط، لا تقم بإضافة عناصر جديدة
ZADD leaderboard XX 500 "player5"
(integer) 0  # player5 غير موجود، لم يتم الإضافة

# CH: إرجاع عدد العناصر التي تغيرت (بما في ذلك التحديثات)
ZADD leaderboard CH 120 "player1"
(integer) 1  # تم تحديث درجة player1

# INCR: زيادة الدرجة (مكافئ لـ ZINCRBY)
ZADD leaderboard INCR 50 "player1"
"170"  # يُرجع الدرجة الجديدة

(3) تحديث درجة عنصر موجود

REDIS
# إذا كان العنصر موجودًا بالفعل، قم بتحديث درجته
ZADD leaderboard 250 "player1"

# عرض الدرجة الجديدة
ZSCORE leaderboard "player1"
"250"

3. ZSCORE: الحصول على درجة عنصر

REDIS
ZADD leaderboard 100 "player1" 200 "player2"

# الحصول على الدرجة
ZSCORE leaderboard "player1"
"100"

# العنصر غير موجود
ZSCORE leaderboard "notexist"
(nil)

4. ZRANK و ZREVRANK: الحصول على الترتيب

(1) ZRANK: الترتيب من الأقل إلى الأعلى

REDIS
ZADD leaderboard 100 "player1" 200 "player2" 300 "player3"

# الترتيب يبدأ من 0
ZRANK leaderboard "player1"
(integer) 0  # المركز الأول (أقل درجة)

ZRANK leaderboard "player2"
(integer) 1  # المركز الثاني

ZRANK leaderboard "player3"
(integer) 2  # المركز الثالث

(2) ZREVRANK: الترتيب من الأعلى إلى الأقل

REDIS
# الترتيب من الأعلى إلى الأقل (أعلى درجة هي الترتيب 0)
ZREVRANK leaderboard "player3"
(integer) 0  # المركز الأول (أعلى درجة)

ZREVRANK leaderboard "player2"
(integer) 1  # المركز الثاني

ZREVRANK leaderboard "player1"
(integer) 2  # المركز الثالث
💡 قواعد الترتيب:

  • ZRANK: من الأقل إلى الأعلى، أقل درجة لها الترتيب 0
  • ZREVRANK: من الأعلى إلى الأقل، أعلى درجة لها الترتيب 0
  • الترتيب يبدأ من 0، المركز الأول له الترتيب 0

5. ZRANGE و ZREVRANGE: الحصول على العناصر حسب نطاق الترتيب

(1) ZRANGE: الحصول حسب نطاق الترتيب (من الأقل إلى الأعلى)

REDIS
ZADD leaderboard 100 "player1" 200 "player2" 300 "player3" 400 "player4"

# الحصول على جميع العناصر
ZRANGE leaderboard 0 -1
1) "player1"
2) "player2"
3) "player3"
4) "player4"

# الحصول على أول عنصرين
ZRANGE leaderboard 0 1
1) "player1"
2) "player2"

# الحصول على آخر عنصرين
ZRANGE leaderboard -2 -1
1) "player3"
2) "player4"

# الحصول على العناصر مع الدرجات
ZRANGE leaderboard 0 -1 WITHSCORES
1) "player1"
2) "100"
3) "player2"
4) "200"
5) "player3"
6) "300"
7) "player4"
8) "400"

(2) ZREVRANGE: الحصول حسب نطاق الترتيب (من الأعلى إلى الأقل)

REDIS
# الحصول على جميع العناصر من الأعلى إلى الأقل
ZREVRANGE leaderboard 0 -1 WITHSCORES
1) "player4"
2) "400"
3) "player3"
4) "300"
5) "player2"
6) "200"
7) "player1"
8) "100"

# الحصول على أفضل 3 (أعلى الدرجات)
ZREVRANGE leaderboard 0 2 WITHSCORES
1) "player4"
2) "400"
3) "player3"
4) "300"
5) "player2"
6) "200"

6. ZCARD: الحصول على عدد العناصر

REDIS
ZADD leaderboard 100 "player1" 200 "player2" 300 "player3"

ZCARD leaderboard
(integer) 3

7. ZCOUNT: عد العناصر ضمن نطاق درجة

REDIS
ZADD leaderboard 100 "player1" 150 "player2" 200 "player3" 250 "player4" 300 "player5"

# عد العناصر بدرجات بين 150 و 250
ZCOUNT leaderboard 150 250
(integer) 3  # player2، player3، player4

# استخدم -inf و +inf للانهاية السالبة والموجبة
ZCOUNT leaderboard -inf +inf
(integer) 5  # جميع العناصر

8. ZREM: إزالة العناصر

REDIS
ZADD leaderboard 100 "player1" 200 "player2" 300 "player3"

# إزالة عنصر واحد
ZREM leaderboard "player1"
(integer) 1

# إزالة عناصر متعددة
ZREM leaderboard "player2" "player3"
(integer) 2

# إزالة عنصر غير موجود
ZREM leaderboard "notexist"
(integer) 0

9. ZINCRBY: زيادة الدرجة

REDIS
ZADD leaderboard 100 "player1"

# زيادة الدرجة بمقدار 50
ZINCRBY leaderboard 50 "player1"
"150"  # يُرجع الدرجة الجديدة

# إنقاص الدرجة (تمرير رقم سالب)
ZINCRBY leaderboard -20 "player1"
"130"

10. حالات استخدام المجموعات المرتبة

(1) حالة الاستخدام 1: لوحة متصدرين للألعاب

REDIS
# تحديث درجات اللاعبين
ZADD game:leaderboard 1500 "player:123"
ZADD game:leaderboard 2300 "player:456"
ZADD game:leaderboard 1800 "player:789"

# الحصول على أفضل 10
ZREVRANGE game:leaderboard 0 9 WITHSCORES

# الحصول على ترتيب اللاعب
ZREVRANK game:leaderboard "player:123"

# زيادة درجة اللاعب
ZINCRBY game:leaderboard 100 "player:123"

(2) حالة الاستخدام 2: البحث الرائج

REDIS
# تحديث درجات الرواج
ZADD hot:search 10000 "Redis tutorial"
ZADD hot:search 8000 "Python basics"
ZADD hot:search 15000 "JavaScript"

# الحصول على أفضل 10 رائجة
ZREVRANGE hot:search 0 9 WITHSCORES

# زيادة درجة الرواج
ZINCRBY hot:search 100 "Redis tutorial"

(3) حالة الاستخدام 3: قائمة انتظار مؤجلة

REDIS
# إضافة مهام مؤجلة (الدرجة هي طابع زمني للتنفيذ)
ZADD delay:queue 1719129600 "task:1"  # 2024-06-23 10:00:00
ZADD delay:queue 1719133200 "task:2"  # 2024-06-23 11:00:00

# الحصول على المهام قبل الوقت الحالي (المهام التي يجب تنفيذها)
ZRANGEBYSCORE delay:queue -inf 1719129600

(4) حالة الاستخدام 4: العلامات المرجحة

REDIS
# علامات اهتمامات المستخدم (الدرجة هي مستوى الاهتمام)
ZADD user:1:interests 100 "redis"
ZADD user:1:interests 80 "database"
ZADD user:1:interests 60 "cache"

# الحصول على أكثر العلامات أهمية للمستخدم
ZREVRANGE user:1:interests 0 4 WITHSCORES

(5) حالة الاستخدام 5: ترتيب الامتحانات

REDIS
# درجات الطلاب
ZADD exam:math 95 "student:1"
ZADD exam:math 88 "student:2"
ZADD exam:math 92 "student:3"

# الحصول على ترتيب الدرجات
ZREVRANGE exam:math 0 -1 WITHSCORES

# الحصول على ترتيب الطالب
ZREVRANK exam:math "student:1"

11. تحسين ترميز المجموعة المرتبة

يختار Redis ترميزًا تلقائيًا بناءً على حجم المجموعة المرتبة:

الترميز الشرط الوصف
ziplist العناصر <= 128، طول العنصر <= 64 بايت قائمة مضغوطة، توفر الذاكرة
skiplist العناصر > 128 أو طول العنصر > 64 بايت قائمة تخطي + جدول تجزئة، أداء أفضل

(1) التحقق من نوع الترميز

REDIS
ZADD small:zset 1 "a" 2 "b" 3 "c"
OBJECT ENCODING small:zset
"ziplist"

# بعد إضافة العديد من العناصر
OBJECT ENCODING large:zset
"skiplist"

▶ مثال

عمليات المجموعة المرتبة الأساسية:

BASH
127.0.0.1:6379> ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie"
(integer) 3
127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES
1) "Alice"
2) "100"
3) "Charlie"
4) "150"
5) "Bob"
6) "200"

❓ أسئلة شائعة

س ما الفرق بين المجموعة المرتبة والمجموعة؟
ج كل عنصر في المجموعة المرتبة له درجة ويتم ترتيبه بها. المجموعات غير مرتبة. المجموعات المرتبة مثالية للوحات المتصدرين وسيناريوهات الترتيب。
س هل يمكن أن تكون الدرجات أعدادًا عشرية؟
ج نعم. الدرجات هي أعداد عائمة مزدوجة الدقة، تدعم الأعداد العشرية。
س هل ZRANK يُرجع الترتيب بدءًا من 0 أم 1؟
ج من 0. المركز الأول له الترتيب 0، المركز الثاني له الترتيب 1。
س كيف أحصل على العنصر ذي أعلى درجة؟
ج استخدم ZREVRANGE key 0 0 أو ZRANGE key -1 -1。
س هل يمكن تكرار العناصر؟
ج لا. العناصر فريدة، لكن الدرجات يمكن أن تتكرر。

📖 ملخص

📝 تمارين

  1. لوحة متصدرين: استخدم مجموعة مرتبة لتنفيذ لوحة متصدرين للألعاب — حدث الدرجات، اعرض الترتيب، احصل على أفضل 10
  2. قائمة رائجة: نفذ قائمة بحث رائجة — حدث درجات الرواج، اعرض الرائج، زد الرواج
  3. ترتيب امتحان: خزّن درجات الطلاب في مجموعة مرتبة، اعرض الترتيب والدرجات
  4. قائمة انتظار مؤجلة: استخدم مجموعة مرتبة لتنفيذ قائمة انتظار مهام مؤجلة — أضف مهام، احصل على المهام المستحقة

12. الدرس التالي

في الدرس التالي، سنتعلم مجموعات Redis المرتبة (الجزء 2)، والتي تغطي عمليات المجموعات المرتبة المتقدمة.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%