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:
- Estimativa de cardinalidade: conta o número de elementos únicos
- Memória extremamente pequena: cada HyperLogLog usa apenas 12KB
- Contagem aproximada: erro padrão de cerca de 0,81%, adequado para grandes dados
- Não armazena os elementos em si: apenas armazena informações estatísticas
💡 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:
- Contando UV do site (visitantes únicos)
- Contando leitores de artigo
- Contando palavras-chave de pesquisa
- Contando usuários de API
- Estimativa de cardinalidade em larga escala
- Cenários sensíveis à memória
Use Set Quando:
- Precisa de contagem exata
- Precisa recuperar lista de elementos
- Precisa deletar elementos
- Precisa verificar existência de elemento
- Tamanho dos dados é pequeno
❓ 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
- HyperLogLog é para estimativa de cardinalidade, usando 12KB constantes de memória
- PFADD adiciona elementos com deduplicação automática
- PFCOUNT obtém a cardinalidade, pode contar a união de múltiplos HyperLogLogs
- PFMERGE mescla múltiplos HyperLogLogs
- Erro padrão é de cerca de 0,81%, adequado para grandes conjuntos de dados
- Não pode deletar elementos, não pode obter lista de elementos, resultados são aproximados
- Casos de uso: estatísticas de UV, contagens de leitores, palavras-chave de pesquisa, usuários online
📝 Atividades
- Estatísticas de UV: Use HyperLogLog para rastrear UV diário, simule múltiplas visitas de usuários
- Estatísticas de múltiplos dias: Crie HyperLogLogs de UV para vários dias, use PFMERGE para obter UV semanal
- Teste de precisão: Adicione 1000 elementos diferentes, compare o resultado de PFCOUNT com a contagem real
- 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.



