Redis HyperLogLog

HyperLogLog é uma estrutura de dados probabilística usada para estimativa de cardinalidade. Esta lição aborda seu uso.

O que é HyperLogLog?

Características do HyperLogLog:

💡 Comparação:

  • Usando Set: armazena todos os elementos, grande uso de memória
  • Usando HyperLogLog: apenas 12KB, mas os resultados são aproximados
Set: Armazenar 1 milhão de elementos únicos → cerca de 10MB de memória
HyperLogLog: Contar 1 milhão de elementos únicos → apenas 12KB de memória

PFADD: Adicionar Elementos

Uso Básico

REDIS
# Adicionar um único elemento
PFADD uv:20260623 "user:1"
(integer) 1  # Retorna 1 se a cardinalidade pode ter mudado

# Adicionar múltiplos elementos
PFADD uv:20260623 "user:2" "user:3" "user:4"
(integer) 1

# Adicionar um elemento existente
PFADD uv:20260623 "user:1"
(integer) 0  # Retorna 0 se a cardinalidade não mudou

Deduplicação Automática

REDIS
# HyperLogLog faz deduplicação automática
PFADD uv:20260623 "user:1" "user:1" "user:2"
(integer) 0  # user:1 já existe, apenas user:2 é novo
⚠️ Observação: HyperLogLog não armazena os elementos em si; ele apenas atualiza estatísticas internas. Você não pode recuperar a lista real de elementos.

PFCOUNT: Obter Cardinalidade

REDIS
PFADD uv:20260623 "user:1" "user:2" "user:3" "user:4"

# Obter o número de elementos únicos
PFCOUNT uv:20260623
(integer) 4

# Adicionar um elemento duplicado
PFADD uv:20260623 "user:1" "user:5"

# Cardinalidade aumentou em 1 (user:5)
PFCOUNT uv:20260623
(integer) 5

Contando a União de Múltiplos HyperLogLogs

REDIS
# Criar múltiplos HyperLogLogs
PFADD uv:20260622 "user:1" "user:2" "user:3"
PFADD uv:20260623 "user:2" "user:3" "user:4"

# Contar a união de dois dias de UV
PFCOUNT uv:20260622 uv:20260623
(integer) 4  # user:1, user:2, user:3, user:4
💡 Caso de uso: PFCOUNT pode contar a união de múltiplos HyperLogLogs sem mesclá-los primeiro.

PFMERGE: Mesclar HyperLogLogs

PFMERGE mescla múltiplos HyperLogLogs em um.

Uso Básico

REDIS
# Criar múltiplos HyperLogLogs
PFADD uv:20260622 "user:1" "user:2"
PFADD uv:20260623 "user:2" "user:3"
PFADD uv:20260624 "user:3" "user:4"

# Mesclar em um novo HyperLogLog
PFMERGE uv:week uv:20260622 uv:20260623 uv:20260624
OK

# Visualizar a cardinalidade mesclada
PFCOUNT uv:week
(integer) 4  # user:1, user:2, user:3, user:4

Mesclando em um HyperLogLog Existente

REDIS
# Mesclar em um HyperLogLog existente (sobrescreve)
PFMERGE uv:20260622 uv:20260623
OK

PFCOUNT uv:20260622
(integer) 3  # user:1, user:2, user:3

Casos de Uso do HyperLogLog

Caso de Uso 1: Estatísticas de UV do Site

REDIS
# UV diário
PFADD uv:daily:20260623 "user:1"
PFADD uv:daily:20260623 "user:2"
PFADD uv:daily:20260623 "user:3"

# Visualizar UV de hoje
PFCOUNT uv:daily:20260623
(integer) 3

# UV semanal
PFMERGE uv:weekly:2026w25 uv:daily:20260617 uv:daily:20260618 ... uv:daily:20260623
PFCOUNT uv:weekly:2026w25

Caso de Uso 2: Contagem de Leitores de Artigo

REDIS
# Contagem de leitores de artigo
PFADD article:123:readers "user:1"
PFADD article:123:readers "user:2"
PFADD article:123:readers "user:3"

# Visualizar contagem de leitores
PFCOUNT article:123:readers
(integer) 3

Caso de Uso 3: Estatísticas de Palavras-chave de Pesquisa

REDIS
# Palavras-chave de pesquisa de hoje (únicas)
PFADD search:keywords:20260623 "redis"
PFADD search:keywords:20260623 "mysql"
PFADD search:keywords:20260623 "redis"

# Visualizar contagem de palavras-chave únicas
PFCOUNT search:keywords:20260623
(integer) 2

Caso de Uso 4: Contagem de Usuários Online

REDIS
# Usuários online atuais
PFADD online:users "user:1"
PFADD online:users "user:2"
PFADD online:users "user:3"

# Visualizar contagem de usuários online
PFCOUNT online:users
(integer) 3

# Usuário fica offline (precisa reconstruir HyperLogLog, o que é trabalhoso)
# HyperLogLog não suporta deletar elementos individuais

Caso de Uso 5: Estatísticas de Chamadas de API

REDIS
# Usuários que chamam API
PFADD api:users:get:user 1001
PFADD api:users:get:user 1002
PFADD api:users:get:user 1003

# Visualizar contagem de chamadores únicos
PFCOUNT api:users:get:user
(integer) 3

HyperLogLog vs Set Comparação

Comparação de Memória

Tamanho dos Dados Memória do Set Memória do HyperLogLog
10K ~800KB 12KB
100K ~8MB 12KB
1M ~80MB 12KB
10M ~800MB 12KB
💡 Conclusão: O uso de memória do HyperLogLog é constante em 12KB, independentemente do tamanho dos dados.

Comparação de Precisão

Estrutura de Dados Precisão Caso de Uso
Set Exata Precisa de contagens exatas, precisa da lista de elementos
HyperLogLog Aproximada (0,81% de erro) Grandes dados, apenas cardinalidade, sensível à memória

Comparação de Recursos

Recurso Set HyperLogLog
Adicionar elementos ✅ SADD ✅ PFADD
Remover elementos ✅ SREM ❌ Não suportado
Obter lista de elementos ✅ SMEMBERS ❌ Não suportado
Verificar existência de elemento ✅ SISMEMBER ❌ Não suportado
Obter cardinalidade ✅ SCARD ✅ PFCOUNT
Mesclar ✅ SUNIONSTORE ✅ PFMERGE

Teste de Precisão do HyperLogLog

Código de Teste

REDIS
# Adicionar 1 milhão de elementos diferentes
for i in range(1000000):
    PFADD test:hll f"user:{i}"

# Visualizar o resultado
PFCOUNT test:hll
(integer) 1000123  # Ligeiramente impreciso, erro de cerca de 0,012%
ℹ️ Observação: O erro padrão do HyperLogLog é de cerca de 0,81%, mas o erro real costuma ser menor.

Limitações do HyperLogLog

1. Não Pode Remover Elementos

REDIS
# HyperLogLog não suporta remover elementos individuais
# Se a remoção for necessária, você deve reconstruir todo o HyperLogLog

2. Não Pode Obter Lista de Elementos

REDIS
# HyperLogLog não armazena os elementos em si
# Não pode usar SMEMBERS como um Set para recuperar todos os elementos

3. Resultados São Aproximados

REDIS
# HyperLogLog retorna uma cardinalidade aproximada
# Não exata, com cerca de 0,81% de erro

4. Não Pode Verificar Existência de Elemento

REDIS
# HyperLogLog não suporta verificar se um elemento existe
# Não pode usar SISMEMBER como um Set

Quando Usar HyperLogLog?

Use HyperLogLog Quando:

Use Set Quando:

❓ Perguntas Frequentes

P Qual é o tamanho do erro do HyperLogLog?
R O erro padrão é de cerca de 0,81%. Para 1 milhão de pontos de dados, o erro é de cerca de 8000. O erro real costuma ser menor.
P Quanta memória o HyperLogLog usa?
R Cada HyperLogLog usa 12KB fixos de memória, independentemente do tamanho dos dados.
P Quantos elementos o HyperLogLog pode armazenar?
R Teoricamente ilimitado (2^64), mas praticamente limitado pela precisão. Conjuntos de dados maiores têm erro relativo menor.
P Como deleto um elemento do HyperLogLog?
R Não suportado. Você só pode deletar todo o HyperLogLog (comando DEL) ou reconstruí-lo.
P Como escolher entre HyperLogLog e Set?
R Use Set para contagem exata ou quando precisar da lista de elementos. Use HyperLogLog para estimativa de cardinalidade em larga escala.

📖 Resumo

📝 Atividades

  1. Estatísticas de UV: Use HyperLogLog para rastrear UV diário, simule múltiplas visitas de usuários
  2. Estatísticas de múltiplos dias: Crie HyperLogLogs de UV para vários dias, use PFMERGE para obter UV semanal
  3. Teste de precisão: Adicione 1000 elementos diferentes, compare o resultado de PFCOUNT com a contagem real
  4. Teste de comparação: Compare o uso de memória entre Set e HyperLogLog para os mesmos dados

Próxima Lição

Na próxima lição, nós aprenderemos sobre Pub/Sub do Redis, abordando publicação e assinatura de mensagens.

100%