Calculul Cardinalității cu HyperLogLog în Redis: PFADD, PFCOUNT și PFMERGE în Redis & In-Memory Data Store

Structuri de Date Standard Redis

Ghid complet pentru algoritmul probabilistic HyperLogLog în Redis: numărarea elementelor unice (DAU/MAU) la scară de miliarde cu un consum fix de maximum 12 KB de memorie RAM și eroare standard de 0.81%.

Sintaxă comandă
PFADD unique:visits 'user:101' | PFCOUNT unique:visits | PFMERGE dest hll1 hll2

Calcularea numărului de utilizatori unici zilnici (DAU – Daily Active Users), adrese IP distincte sau termeni de căutare unici folosind structuri clasice de tip Set devine extrem de costisitoare: un set cu 100 de milioane de șiruri de 32 de octeți necesită peste 4-6 GB de memorie RAM.

Pentru a rezolva această problemă la scară uriașă, Redis implementează algoritmul probabilistic HyperLogLog (HLL). O structură HyperLogLog consumă un maxim garantat de 12 KB de memorie RAM indiferent dacă numărați 10 elemente sau 1 miliard de elemente, oferind o eroare standard de aproximare de doar 0.81%.

Urmărirea Vizitatorilor Unici și Fuzionarea Metricilor cu HyperLogLog
# 1. Înregistrăm vizitele utilizatorilor pe parcursul zilei de luni:
PFADD vizite:2026-10-20 "ip:86.124.10.1" "ip:194.102.5.8" "user:9912"
# Răspuns: (integer) 1 (dacă cel puțin un registru intern a fost modificat)

# 2. Adăugăm intrări noi (duplicatele sunt ignorate probabilistic):
PFADD vizite:2026-10-20 "ip:86.124.10.1" "ip:79.112.44.20"

# 3. Aflăm cardinalitatea unică estimată pentru ziua de luni:
PFCOUNT vizite:2026-10-20
# Răspuns: (integer) 4

# 4. Înregistrăm vizitele din ziua de marți:
PFADD vizite:2026-10-21 "ip:86.124.10.1" "ip:109.166.8.9" "user:400"

# 5. Fuzionăm registrele zilnice într-o structură consolidată pentru întreaga săptămână:
# Operația PFMERGE realizează reuniunea matematică a registrelor în timp O(N) infim:
PFMERGE vizite:saptamana_42 vizite:2026-10-20 vizite:2026-10-21

PFCOUNT vizite:saptamana_42
# Răspuns: (integer) 6 (vizitatorul duplicat comun 'ip:86.124.10.1' este numărat o singură dată!)

Cum Funcționează Matematic HyperLogLog?

HyperLogLog calculează un hash pe 64 de biți pentru fiecare element introdus. Observă numărul de zerouri consecutive de la începutul șirului binar rezultat: dacă un hash are k zerouri la început, probabilitatea matematică este ca setul să conțină aproximativ $2^k$ elemente unice. Pentru a elimina anomaliile statistice, Redis folosește 16.384 de registre interne independente (de 6 biți fiecare: $16384 \times 6 = 98.304 \text{ biți} \approx 12 \text{ KB}$) și calculează media armonică a estimărilor.