سلاسل Redis (الجزء 2)
يغطي هذا الدرس العمليات الرقمية وعمليات البت على السلاسل، مما يتيح حالات استخدام مثل العدادات والإحصائيات.
العمليات الرقمية
يمكن لسلاسل Redis تخزين الأعداد الصحيحة ودعم العمليات الرقمية الذرية.
INCR و DECR: الزيادة والإنقاص
REDIS
# تعيين القيمة الأولية
SET counter 10
# زيادة بمقدار 1
INCR counter
(integer) 11
# إنقاص بمقدار 1
DECR counter
(integer) 10
💡 الذرية: INCR و DECR هما عمليتان ذريتان. يمكن لعدة عملاء تنفيذ INCR في وقت واحد دون تعارض، مما يجعلها مثالية للعدادات.
INCRBY و DECRBY: تحديد مقدار الزيادة
REDIS
SET counter 100
# زيادة بمقدار 10
INCRBY counter 10
(integer) 110
# إنقاص بمقدار 20
DECRBY counter 20
(integer) 90
INCRBYFLOAT: العمليات على الأعداد العائمة
REDIS
SET price 10.5
# زيادة بمقدار 2.3
INCRBYFLOAT price 2.3
"12.8"
# إنقاص بمقدار 1.5 (تمرير رقم سالب)
INCRBYFLOAT price -1.5
"11.3"
⚠️ ملاحظة: INCRBYFLOAT يُرجع رقمًا عائمًا بتنسيق سلسلة، وليس عددًا صحيحًا.
قيود العمليات الرقمية
REDIS
# العمليات على سلاسل غير رقمية ستفشل
SET text "hello"
INCR text
(error) ERR value is not an integer or out of range
# العملية على مفتاح غير موجود (يبدأ من 0)
INCR newcounter
(integer) 1 # زاد من 0 إلى 1
حالة الاستخدام: العدادات
REDIS
# عدد مشاهدات المقالة
INCR article:123:views
(integer) 1
# عدد إعجابات المستخدم
INCR user:456:likes
(integer) 1
# عدد استدعاءات API
INCR api:usage:20260623
(integer) 1
عمليات النطاق
GETRANGE: الحصول على سلسلة فرعية
REDIS
SET message "Hello Redis World"
# الحصول على أول 5 أحرف
GETRANGE message 0 4
"Hello"
# الحصول على الجزء الأوسط
GETRANGE message 6 10
"Redis"
# الحصول على آخر 5 أحرف
GETRANGE message -5 -1
"World"
# الحصول على السلسلة بأكملها
GETRANGE message 0 -1
"Hello Redis World"
💡 قواعد الفهرس:
- الفهارس تبدأ من 0
- الموضع النهائي شامل
- الفهارس السالبة تعد من النهاية (-1 هو آخر حرف)
SETRANGE: استبدال سلسلة فرعية
REDIS
SET message "Hello World"
# استبدال بدءًا من الموضع 6
SETRANGE message 6 "Redis"
(integer) 11 # يُرجع طول السلسلة
GET message
"Hello Redis"
# استبدال يتجاوز الطول الأصلي (يملأ تلقائيًا)
SET short "Hi"
SETRANGE short 5 "There"
(integer) 10
GET short
"Hi\x00\x00\x00There" # ممتلئ ببايتات فارغة بينهما
⚠️ ملاحظة: إذا تجاوز SETRANGE طول السلسلة الأصلي، تُملأ الفجوة ببايتات فارغة (\x00).
عمليات البت
تدعم سلاسل Redis عمليات البت، المفيدة لمرشحات Bloom وإحصائيات الصور النقطية، إلخ.
SETBIT و GETBIT: تعيين والحصول على البتات
REDIS
# تعيين الصورة النقطية (كلها 0 في البداية)
SETBIT mybitmap 0 1
(integer) 0 # يُرجع القيمة القديمة
SETBIT mybitmap 2 1
(integer) 0
SETBIT mybitmap 7 1
(integer) 0
# الحصول على قيمة بت
GETBIT mybitmap 0
(integer) 1
GETBIT mybitmap 1
(integer) 0
GETBIT mybitmap 2
(integer) 1
BITCOUNT: عد البتات المعينة إلى 1
REDIS
# عد جميع البتات
BITCOUNT mybitmap
(integer) 3 # 3 بتات معينة إلى 1
# العد ضمن نطاق بايت
BITCOUNT mybitmap 0 0
(integer) 3 # البايت 0 به 3 بتات معينة إلى 1
BITOP: عمليات البت
REDIS
# إنشاء صورتين نقطيتين
SETBIT bitmap1 0 1
SETBIT bitmap1 1 1
SETBIT bitmap2 1 1
SETBIT bitmap2 2 1
# AND
BITOP AND result bitmap1 bitmap2
(integer) 1
GETBIT result 1
(integer) 1 # فقط البت 1 هو 1 في كليهما
# OR
BITOP OR result bitmap1 bitmap2
(integer) 1
# XOR
BITOP XOR result bitmap1 bitmap2
(integer) 1
# NOT (يدعم مفتاحًا واحدًا فقط)
BITOP NOT result bitmap1
(integer) 1
BITPOS: العثور على أول موضع 0 أو 1
REDIS
SET mykey "\xff\xf0\x00" # ثنائي: 11111111 11110000 00000000
# العثور على أول 0
BITPOS mykey 0
(integer) 12 # البت 12 هو أول 0
# العثور على أول 1
BITPOS mykey 1
(integer) 0 # البت 0 هو أول 1
# البحث ضمن نطاق بايت
BITPOS mykey 1 1 2
(integer) 8 # ضمن البايتات 1-2، البت 8 هو أول 1
حالة الاستخدام: تسجيل حضور المستخدم
REDIS
# المستخدم 123 يسجل حضوره في 23 يونيو 2026 (اليوم 174 من السنة)
SETBIT user:123:signin:2026 174 1
# التحقق من التسجيل
GETBIT user:123:signin:2026 174
(integer) 1
# عد إجمالي أيام الحضور للسنة
BITCOUNT user:123:signin:2026
(integer) 50 # سجل حضوره 50 يومًا
# التحقق من الحضور المتتالي (يتطلب BITPOS ومنطق الأعمال)
حالة الاستخدام: إحصاءات المستخدمين النشطين
REDIS
# المستخدم 123 يتصل
SETBIT online:users 123 1
# المستخدم 456 يتصل
SETBIT online:users 456 1
# عد المستخدمين النشطين
BITCOUNT online:users
(integer) 2
# المستخدم 123 ينقطع
SETBIT online:users 123 0
نصائح عملية للسلاسل
1. توليد معرفات فريدة
REDIS
# استخدام INCR لتوليد معرفات متزايدة
SET next:user:id 1000
INCR next:user:id
(integer) 1001 # معرف المستخدم الجديد
INCR next:user:id
(integer) 1002
2. عداد تحديد المعدل
REDIS
# تحديد معدل API: بحد أقصى 100 مرة في الدقيقة
SET limit:api:user:1 0 EX 60
INCR limit:api:user:1
(integer) 1
# التحقق إذا تم تجاوز الحد
GET limit:api:user:1
"50" # تم الاتصال 50 مرة حاليًا
3. رقم تسلسلي موزع
REDIS
# توليد رقم الطلب
SET order:sequence 1000000000
INCR order:sequence
(integer) 1000000001 # رقم طلب جديد
4. إحصاءات UV (الزوار الفريدون)
REDIS
# استخدام الصورة النقطية لإحصاءات UV
SETBIT uv:20260623 12345 1 # المستخدم 12345 زار
SETBIT uv:20260623 67890 1 # المستخدم 67890 زار
# عد UV
BITCOUNT uv:20260623
(integer) 2 # زائران فريدان
نصائح تحسين الأداء
1. استخدام العمليات الدفعية
REDIS
# ❌ عمليات فردية متعددة
SET key1 "value1"
SET key2 "value2"
SET key3 "value3"
# ✅ عملية دفعات
MSET key1 "value1" key2 "value2" key3 "value3"
2. تعيين انتهاء صلاحية معقول
REDIS
# تعيين انتهاء صلاحية للبيانات المخزنة مؤقتًا
SET cache:key "value" EX 3600
# تجنب انهيار ذاكرة التخزين المؤقت: أضف تشويشًا عشوائيًا لـ TTL
SET cache:key "value" EX 3600
3. اختيار الترميز المناسب
REDIS
# السلاسل القصيرة تستخدم ترميز embstr (<= 44 بايت)
SET short "Hello Redis"
# السلاسل الطويلة تستخدم ترميز raw
SET long "This is a very long string..."
# التحقق من الترميز
OBJECT ENCODING short
"embstr"
❓ أسئلة شائعة
س هل يمكن أن يفيض INCR؟
ج نعم. أعداد Redis الصحيحة هي أعداد صحيحة موقعة 64 بت (النطاق: -2^63 إلى 2^63-1). الخروج عن النطاق سيُرجع خطأ。
س كيف أنفذ عدادًا للأعداد العائمة؟
ج استخدم أمر INCRBYFLOAT، لكن لاحظ أنه يُرجع بتنسيق سلسلة。
س ما هي الاستخدامات العملية لعمليات البت؟
ج يمكن استخدام الصور النقطية لتسجيل حضور المستخدمين وإحصاءات المستخدمين النشطين ومرشحات Bloom وبتات الأذونات — فعالة جدًا من حيث الذاكرة。
س ما هو تعقيد الوقت لـ GETRANGE؟
ج O(N)، حيث N هو طول السلسلة الفرعية المرجعة. الحصول على سلاسل فرعية قصيرة سريع جدًا。
س كيف أخزن نصًا كبيرًا (مثل محتوى المقالة)؟
ج فكر في ضغطه أولاً، أو تجزئته. نهج أفضل هو تخزينه في نظام ملفات أو تخزين كائنات والاحتفاظ بعنوان URL فقط في Redis。
📖 ملخص
- INCR/DECR زيادة وإنقاص ذريان، مثاليان للعدادات
- INCRBY/DECRBY لزيادات مخصصة، INCRBYFLOAT للأعداد العائمة
- GETRANGE/SETRANGE عمليات نطاق، تدعم الفهرسة السالبة
- SETBIT/GETBIT عمليات بت، مفيدة لإحصائيات الصور النقطية
- BITCOUNT يعد البتات المعينة إلى 1، BITOP لعمليات البت
- تطبيقات الصور النقطية: تسجيل حضور المستخدمين، المستخدمون النشطون، إحصاءات UV
- العمليات الرقمية: عدادات، تحديد معدل، توليد معرفات فريدة
📝 تمارين
- عداد: نفذ عداد مشاهدات مقالة، وحاك 10 مشاهدات، وتحقق من العدد النهائي
- عمليات النطاق: عيّن سلسلة طويلة واستخدم GETRANGE لاسترجاع أجزاء مختلفة
- تسجيل حضور بالصورة النقطية: استخدم صورة نقطية لتسجيل حضور المستخدم وعد أيام الحضور
- إحصاءات UV: استخدم صورة نقطية لتتبع UVs لموقع، ومحاكاة زيارات مستخدمين متعددين
الدرس التالي
في الدرس التالي، سنتعلم تجزئات Redis (الجزء 1)، والتي تغطي عمليات التجزئة الأساسية.



