HyperLogLog في Redis
HyperLogLog هو هيكل بيانات احتمالي يُستخدم لتقدير العددية. يغطي هذا الدرس استخدامه.
ما هو HyperLogLog؟
ميزات HyperLogLog:
- تقدير العددية: يعد عدد العناصر الفريدة
- ذاكرة صغيرة جدًا: كل HyperLogLog يستخدم 12KB فقط
- عد تقريبي: خطأ قياسي حوالي 0.81%، مناسب للبيانات الكبيرة
- لا يخزن العناصر نفسها: يخزن فقط معلومات إحصائية
💡 مقارنة:
- استخدام Set: يخزن جميع العناصر، استخدام ذاكرة كبير
- استخدام HyperLogLog: 12KB فقط، لكن النتائج تقريبية
Set: تخزين مليون عنصر فريد → حوالي 10MB ذاكرة
HyperLogLog: عد مليون عنصر فريد → 12KB فقط ذاكرة
PFADD: إضافة عناصر
الاستخدام الأساسي
REDIS
# إضافة عنصر واحد
PFADD uv:20260623 "user:1"
(integer) 1 # يُرجع 1 إذا قد تكون العددية قد تغيرت
# إضافة عناصر متعددة
PFADD uv:20260623 "user:2" "user:3" "user:4"
(integer) 1
# إضافة عنصر موجود
PFADD uv:20260623 "user:1"
(integer) 0 # يُرجع 0 إذا لم تتغير العددية
إزالة التكرار التلقائي
REDIS
# HyperLogLog يزيل التكرار تلقائيًا
PFADD uv:20260623 "user:1" "user:1" "user:2"
(integer) 0 # user:1 موجود بالفعل، فقط user:2 جديد
⚠️ ملاحظة: HyperLogLog لا يخزن العناصر نفسها؛ يقوم فقط بتحديث الإحصائيات الداخلية. لا يمكنك استرجاع قائمة العناصر الفعلية.
PFCOUNT: الحصول على العددية
REDIS
PFADD uv:20260623 "user:1" "user:2" "user:3" "user:4"
# الحصول على عدد العناصر الفريدة
PFCOUNT uv:20260623
(integer) 4
# إضافة عنصر مكرر
PFADD uv:20260623 "user:1" "user:5"
# العددية زادت بمقدار 1 (user:5)
PFCOUNT uv:20260623
(integer) 5
عد اتحاد HyperLogLogs متعددة
REDIS
# إنشاء HyperLogLogs متعددة
PFADD uv:20260622 "user:1" "user:2" "user:3"
PFADD uv:20260623 "user:2" "user:3" "user:4"
# عد اتحاد يومين من UV
PFCOUNT uv:20260622 uv:20260623
(integer) 4 # user:1, user:2, user:3, user:4
💡 حالة الاستخدام: PFCOUNT يمكنه عد اتحاد HyperLogLogs متعددة دون دمجها أولاً.
PFMERGE: دمج HyperLogLogs
PFMERGE يدمج HyperLogLogs متعددة في واحد.
الاستخدام الأساسي
REDIS
# إنشاء HyperLogLogs متعددة
PFADD uv:20260622 "user:1" "user:2"
PFADD uv:20260623 "user:2" "user:3"
PFADD uv:20260624 "user:3" "user:4"
# الدمج في HyperLogLog جديد
PFMERGE uv:week uv:20260622 uv:20260623 uv:20260624
OK
# عرض العددية المدمجة
PFCOUNT uv:week
(integer) 4 # user:1, user:2, user:3, user:4
الدمج في HyperLogLog موجود
REDIS
# الدمج في HyperLogLog موجود (يستبدل)
PFMERGE uv:20260622 uv:20260623
OK
PFCOUNT uv:20260622
(integer) 3 # user:1, user:2, user:3
حالات استخدام HyperLogLog
حالة الاستخدام 1: إحصاءات UV لموقع ويب
REDIS
# UV يومي
PFADD uv:daily:20260623 "user:1"
PFADD uv:daily:20260623 "user:2"
PFADD uv:daily:20260623 "user:3"
# عرض UV اليوم
PFCOUNT uv:daily:20260623
(integer) 3
# UV أسبوعي
PFMERGE uv:weekly:2026w25 uv:daily:20260617 uv:daily:20260618 ... uv:daily:20260623
PFCOUNT uv:weekly:2026w25
حالة الاستخدام 2: عدد قراء المقالات
REDIS
# عدد قراء المقالة
PFADD article:123:readers "user:1"
PFADD article:123:readers "user:2"
PFADD article:123:readers "user:3"
# عرض عدد القراء
PFCOUNT article:123:readers
(integer) 3
حالة الاستخدام 3: إحصاءات كلمات البحث
REDIS
# كلمات البحث اليوم (فريدة)
PFADD search:keywords:20260623 "redis"
PFADD search:keywords:20260623 "mysql"
PFADD search:keywords:20260623 "redis"
# عرض عدد الكلمات الفريدة
PFCOUNT search:keywords:20260623
(integer) 2
حالة الاستخدام 4: عدد المستخدمين النشطين
REDIS
# المستخدمون النشطون حاليًا
PFADD online:users "user:1"
PFADD online:users "user:2"
PFADD online:users "user:3"
# عرض عدد المستخدمين النشطين
PFCOUNT online:users
(integer) 3
# المستخدم ينقطع (يحتاج إعادة بناء HyperLogLog، وهو أمر مرهق)
# HyperLogLog لا يدعم حذف العناصر الفردية
حالة الاستخدام 5: إحصاءات استدعاءات API
REDIS
# مستخدمو API
PFADD api:users:get:user 1001
PFADD api:users:get:user 1002
PFADD api:users:get:user 1003
# عرض عدد المستخدمين الفريدين
PFCOUNT api:users:get:user
(integer) 3
مقارنة HyperLogLog مع Set
مقارنة الذاكرة
| حجم البيانات | ذاكرة Set | ذاكرة HyperLogLog |
|---|---|---|
| 10K | ~800KB | 12KB |
| 100K | ~8MB | 12KB |
| 1M | ~80MB | 12KB |
| 10M | ~800MB | 12KB |
💡 النتيجة: استخدام ذاكرة HyperLogLog ثابت 12KB، بغض النظر عن حجم البيانات.
مقارنة الدقة
| هيكل البيانات | الدقة | حالة الاستخدام |
|---|---|---|
| Set | دقيق | يحتاج عدًا دقيقًا، يحتاج قائمة العناصر |
| HyperLogLog | تقريبي (خطأ 0.81%) | بيانات كبيرة، عددية فقط، حساسية للذاكرة |
مقارنة الميزات
| الميزة | Set | HyperLogLog |
|---|---|---|
| إضافة عناصر | ✅ SADD | ✅ PFADD |
| إزالة عناصر | ✅ SREM | ❌ غير مدعومة |
| الحصول على قائمة العناصر | ✅ SMEMBERS | ❌ غير مدعومة |
| التحقق من وجود عنصر | ✅ SISMEMBER | ❌ غير مدعومة |
| الحصول على العددية | ✅ SCARD | ✅ PFCOUNT |
| الدمج | ✅ SUNIONSTORE | ✅ PFMERGE |
اختبار دقة HyperLogLog
كود الاختبار
REDIS
# إضافة مليون عنصر مختلف
for i in range(1000000):
PFADD test:hll f"user:{i}"
# عرض النتيجة
PFCOUNT test:hll
(integer) 1000123 # انحراف طفيف، خطأ حوالي 0.012%
ℹ️ ملاحظة: الخطأ القياسي لـ HyperLogLog حوالي 0.81%، لكن الخطأ الفعلي غالبًا ما يكون أصغر.
قيود HyperLogLog
1. لا يمكن إزالة العناصر
REDIS
# HyperLogLog لا يدعم إزالة العناصر الفردية
# إذا كانت الإزالة مطلوبة، يجب إعادة بناء HyperLogLog بأكمله
2. لا يمكن الحصول على قائمة العناصر
REDIS
# HyperLogLog لا يخزن العناصر نفسها
# لا يمكن استخدام SMEMBERS مثل Set لاسترجاع جميع العناصر
3. النتائج تقريبية
REDIS
# HyperLogLog يُرجع عددية تقريبية
# ليست دقيقة، مع خطأ حوالي 0.81%
4. لا يمكن التحقق من وجود عنصر
REDIS
# HyperLogLog لا يدعم التحقق من وجود عنصر
# لا يمكن استخدام SISMEMBER مثل Set
متى تستخدم HyperLogLog؟
استخدم HyperLogLog عندما:
- عد UV لموقع ويب (زوار فريدون)
- عد قراء المقالات
- عد كلمات البحث
- عد مستخدمي API
- تقدير عددية على نطاق واسع
- سيناريوهات حساسة للذاكرة
استخدم Set عندما:
- تحتاج عدًا دقيقًا
- تحتاج استرجاع قائمة العناصر
- تحتاج حذف العناصر
- تحتاج التحقق من وجود عنصر
- حجم البيانات صغير
❓ أسئلة شائعة
س ما حجم خطأ HyperLogLog؟
ج الخطأ القياسي حوالي 0.81%. لمليون نقطة بيانات، الخطأ حوالي 8000. الخطأ الفعلي غالبًا ما يكون أصغر。
س كم ذاكرة يستخدم HyperLogLog؟
ج كل HyperLogLog يستخدم 12KB ثابت من الذاكرة، بغض النظر عن حجم البيانات。
س كم عدد العناصر التي يمكن لـ HyperLogLog تخزينها؟
ج نظريًا غير محدود (2^64)، لكن عمليًا محدود بالدقة. مجموعات البيانات الأكبر لها خطأ نسبي أصغر。
س كيف أحذف عنصرًا من HyperLogLog؟
ج غير مدعوم. يمكنك فقط حذف HyperLogLog بأكمله (أمر DEL) أو إعادة بنائه。
س كيف أختار بين HyperLogLog و Set؟
ج استخدم Set للعد الدقيق أو عندما تحتاج قائمة العناصر. استخدم HyperLogLog لتقدير العددية على نطاق واسع。
📖 ملخص
- HyperLogLog مخصص لتقدير العددية، يستخدم 12KB ثابت من الذاكرة
- PFADD يضيف عناصر مع إزالة التكرار التلقائي
- PFCOUNT يحصل على العددية، يمكنه عد اتحاد HyperLogLogs متعددة
- PFMERGE يدمج HyperLogLogs متعددة
- الخطأ القياسي حوالي 0.81%، مناسب لمجموعات البيانات الكبيرة
- لا يمكن حذف العناصر، لا يمكن الحصول على قائمة العناصر، النتائج تقريبية
- حالات الاستخدام: إحصاءات UV، عدد القراء، كلمات البحث، المستخدمون النشطون
📝 تمارين
- إحصاءات UV: استخدم HyperLogLog لتتبع UV اليومي، محاكاة زيارات مستخدمين متعددين
- إحصاءات متعددة الأيام: أنشئ HyperLogLogs UV لأيام متعددة، استخدم PFMERGE للحصول على UV الأسبوعي
- اختبار الدقة: أضف 1000 عنصر مختلف، قارن نتيجة PFCOUNT مع العدد الفعلي
- اختبار المقارنة: قارن استخدام الذاكرة بين Set و HyperLogLog لنفس البيانات
الدرس التالي
في الدرس التالي، سنتعلم النشر/الاشتراك في Redis، والذي يغطي نشر الرسائل والاشتراك.



