HyperLogLog في Redis

HyperLogLog هو هيكل بيانات احتمالي يُستخدم لتقدير العددية. يغطي هذا الدرس استخدامه.

ما هو HyperLogLog؟

ميزات HyperLogLog:

💡 مقارنة:

  • استخدام 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 عندما:

استخدم Set عندما:

❓ أسئلة شائعة

س ما حجم خطأ HyperLogLog؟
ج الخطأ القياسي حوالي 0.81%. لمليون نقطة بيانات، الخطأ حوالي 8000. الخطأ الفعلي غالبًا ما يكون أصغر。
س كم ذاكرة يستخدم HyperLogLog؟
ج كل HyperLogLog يستخدم 12KB ثابت من الذاكرة، بغض النظر عن حجم البيانات。
س كم عدد العناصر التي يمكن لـ HyperLogLog تخزينها؟
ج نظريًا غير محدود (2^64)، لكن عمليًا محدود بالدقة. مجموعات البيانات الأكبر لها خطأ نسبي أصغر。
س كيف أحذف عنصرًا من HyperLogLog؟
ج غير مدعوم. يمكنك فقط حذف HyperLogLog بأكمله (أمر DEL) أو إعادة بنائه。
س كيف أختار بين HyperLogLog و Set؟
ج استخدم Set للعد الدقيق أو عندما تحتاج قائمة العناصر. استخدم HyperLogLog لتقدير العددية على نطاق واسع。

📖 ملخص

📝 تمارين

  1. إحصاءات UV: استخدم HyperLogLog لتتبع UV اليومي، محاكاة زيارات مستخدمين متعددين
  2. إحصاءات متعددة الأيام: أنشئ HyperLogLogs UV لأيام متعددة، استخدم PFMERGE للحصول على UV الأسبوعي
  3. اختبار الدقة: أضف 1000 عنصر مختلف، قارن نتيجة PFCOUNT مع العدد الفعلي
  4. اختبار المقارنة: قارن استخدام الذاكرة بين Set و HyperLogLog لنفس البيانات

الدرس التالي

في الدرس التالي، سنتعلم النشر/الاشتراك في Redis، والذي يغطي نشر الرسائل والاشتراك.

100%