O TairCpc é uma estrutura de dados baseada no sketch de contagem de probabilidade comprimida (CPC). Ele oferece estimativa de cardinalidade com alta precisão e consumo de memória significativamente menor que o HyperLogLog (HLL), sendo ideal para deduplicação em tempo real em fluxos de dados de alto throughput.
Contexto
Sistemas de decisão em tempo real processam eventos de negócio conforme ocorrem, armazenam resultados para acesso rápido e aplicam regras para agir imediatamente. A contagem de cardinalidade com baixa latência é crítica em cenários como:
Prevenção de fraudes com cartão de crédito: identificar se um cartão está sendo usado em contexto suspeito e interromper transações duvidosas o mais cedo possível.
Combate à revenda ilegal de ingressos: detectar e bloquear bots que usam dispositivos virtuais e endereços IP falsos antes da aquisição de estoque.
Com o TairCpc, você deduplica os dados recebidos por dimensão, armazena o sketch em uma instância Tair e executa consultas de agregação em nanosegundos — combinando armazenamento e processamento em uma única camada.
Visão geral
O CPC conta valores distintos em um fluxo de dados e permite mesclar vários sketches para obter um total combinado. Em comparação ao HLL, o CPC atinge a mesma precisão com aproximadamente 40% menos memória.
O TairCpc estende a implementação open source do CPC e reduz a taxa de erro para 0,008%, contra 0,67% do CPC padrão e 1,95% do HLL.
Considere o TairCpc como uma alternativa eficiente em memória ao Set para contar itens únicos:
|
Operação |
Equivalente em Set |
Equivalente em TairCpc |
|
Adicionar um item |
|
|
|
Contar itens únicos |
|
|
Diferentemente de um Set, o TairCpc não armazena os itens brutos — ele guarda um sketch compacto que aproxima a contagem. Essa troca permite agregações em escala massiva com latência sub-milissegundo.
Principais recursos
Baixo consumo de memória com leituras e gravações incrementais e E/S mínima
Deduplicação de alto desempenho e altíssima precisão
Taxa de erro reduzida de 0,008% (contra 0,67% do CPC open source e 1,95% do HLL)
Casos de uso
Sistemas de segurança bancária: quantas contas ou dispositivos distintos executaram uma determinada ação no último minuto?
Vendas relâmpago: quantos usuários únicos tentaram comprar este item na janela de tempo atual?
Combate à revenda ilegal de ingressos: quantos endereços IP distintos enviaram solicitações desta sessão nos últimos 10 segundos?
Pré-requisitos
Antes de começar, verifique se sua instância pertence a um dos seguintes tipos da série Tair:
Instância baseada em DRAM. Se a instância for compatível com Redis 5.0, a versão secundária deve ser 1.7.20 ou posterior.
Instância otimizada para memória persistente com versão secundária 1.2.3.3 ou posterior.
Mantenha sua instância na versão secundária mais recente para garantir o maior número de recursos e a melhor estabilidade. Para instruções de atualização, consulte Atualizar a versão secundária de uma instância . Para instâncias cluster e instâncias com divisão de leitura/escrita, atualize também os nós proxy para a versão secundária mais recente, garantindo que todos os comandos funcionem conforme esperado.
Observações de uso
Os dados do TairCpc são armazenados em uma instância Tair.
Comandos suportados
|
Comando |
Sintaxe |
Descrição |
|||
|
|
EXAT |
PX |
PXAT time]` |
Adiciona um item a uma chave. Cria a chave se ela não existir. Não faz nada se o item já existir. |
|
|
|
Retorna a estimativa de cardinalidade deduplicada para uma chave como DOUBLE. |
||||
|
|
EXAT |
PX |
PXAT time]` |
Adiciona um item e retorna a estimativa DOUBLE atualizada. Cria a chave se ela não existir. |
|
|
|
EXAT |
PX |
PXAT time]` |
Adiciona um item e retorna a estimativa atualizada mais a diferença. Use a diferença para detectar duplicatas: 1 = item novo, 0 = duplicata. |
|
|
|
EXAT |
PX |
PXAT time] [SIZE size] [WIN window_length]` |
Adiciona um item à janela de tempo correspondente ao timestamp fornecido. |
|
|
|
Retorna a estimativa de cardinalidade para a janela de tempo correspondente ao timestamp fornecido. |
||||
|
|
Retorna estimativas de cardinalidade por janela em um intervalo de tempo (intervalo fechado). |
||||
|
|
Retorna a estimativa mesclada e deduplicada a partir de um timestamp, abrangendo N janelas de tempo retroativamente. |
||||
|
|
EXAT |
PX |
PXAT time] [SIZE size] [WIN window_length]` |
Adiciona um item a uma janela de tempo e retorna a estimativa atualizada para essa janela. |
|
|
|
EXAT |
PX |
PXAT time] [SIZE size] [WIN window_length]` |
Adiciona um item a uma janela de tempo e retorna a estimativa atualizada e a diferença para essa janela. |
|
|
|
Exclui uma ou mais chaves TairCpc. |
Convenções de sintaxe
MAIÚSCULAS: palavra-chave do comando_itálico_: variável[opção]: parâmetro opcionalA|B: opções mutuamente exclusivas — especifique apenas uma...: o parâmetro anterior pode ser repetido
CPC.UPDATE
Adiciona um item a uma chave TairCpc. Cria a chave se ela não existir. Se o item já existir, o comando não executa nenhuma operação.
Sintaxe
CPC.UPDATE key item [EX|EXAT|PX|PXAT time]
Complexidade de tempo O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave TairCpc a atualizar. |
|
|
Item a adicionar. |
|
|
Tempo de expiração relativo em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração relativo em milissegundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em milissegundos. A chave não expira se omitido. |
Valor de retorno
OKem caso de sucesso.Mensagem de erro em caso de falha.
Exemplo
CPC.UPDATE foo f1 EX 3600
OK
CPC.ESTIMATE
Retorna a estimativa de cardinalidade de uma chave TairCpc após deduplicação. O valor retornado é um DOUBLE — arredonde para o inteiro mais próximo para obter uma contagem utilizável.
Sintaxe
CPC.ESTIMATE key
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave TairCpc a consultar. |
Valor de retorno
Estimativa de cardinalidade do tipo DOUBLE em caso de sucesso.
Mensagem de erro em caso de falha.
Exemplo
CPC.ESTIMATE foo
"19.000027716212127"
CPC.UPDATE2EST
Adiciona um item a uma chave TairCpc e retorna a estimativa de cardinalidade atualizada em uma única ida e volta. Cria a chave se ela não existir.
Sintaxe
CPC.UPDATE2EST key item [EX|EXAT|PX|PXAT time]
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave TairCpc a atualizar. |
|
|
Item a adicionar. |
|
|
Tempo de expiração relativo em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração relativo em milissegundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em milissegundos. A chave não expira se omitido. |
Valor de retorno
Estimativa de cardinalidade do tipo DOUBLE após a atualização em caso de sucesso.
Mensagem de erro em caso de falha.
Exemplo
CPC.UPDATE2EST foo f3
"3.0000004768373003"
CPC.UPDATE2JUD
Adiciona um item a uma chave TairCpc e retorna tanto a estimativa de cardinalidade atualizada quanto a diferença em relação à estimativa anterior. Use a diferença para determinar se o item era novo ou já existia — sem precisar de um comando de leitura separado.
Se a diferença retornada for 1, o item era novo (sem duplicata).
Se a diferença retornada for 0, o item já existia (duplicata detectada).
Cria a chave se ela não existir.
Sintaxe
CPC.UPDATE2JUD key item [EX|EXAT|PX|PXAT time]
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave TairCpc a atualizar. |
|
|
Item a adicionar. |
|
|
Tempo de expiração relativo em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração relativo em milissegundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em milissegundos. A chave não expira se omitido. |
Valor de retorno
Em caso de sucesso: dois valores DOUBLE — a nova estimativa de cardinalidade e, em seguida, a diferença entre as estimativas nova e anterior.
Mensagem de erro em caso de falha.
Exemplo
CPC.UPDATE2JUD foo f20
1) "20.000027716212127" // New cardinality estimate: 20
2) "1.0000014901183398" // Difference: 20 - 19 = 1 (new item)
CPC.ARRAY.UPDATE
Adiciona um item a uma chave de array TairCpc dentro da janela de tempo correspondente ao timestamp fornecido. Cria a chave se ela não existir.
Uma chave de array TairCpc mantém uma janela deslizante de sketches CPC. Cada chamada grava dados na janela de tempo correspondente ao timestamp. O período total observável é de SIZE × WIN milissegundos. Dados fora desse período são sobrescritos conforme novos dados chegam.
Os parâmetrosSIZEeWINsão aplicados apenas quando a chave é criada pela primeira vez. Gravações subsequentes na mesma chave usam os valores definidos no momento da criação.
Exemplo: Para rastrear eventos únicos por minuto nos últimos 10 minutos, defina SIZE como 10 e WIN como 60000. Quando os dados do 11º minuto chegarem, os dados do primeiro minuto serão sobrescritos.
Sintaxe
CPC.ARRAY.UPDATE key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave de array TairCpc a atualizar. |
|
|
Timestamp UNIX em milissegundos indicando em qual janela de tempo gravar. |
|
|
Item a adicionar. |
|
|
Tempo de expiração relativo em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração relativo em milissegundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em milissegundos. A chave não expira se omitido. |
|
|
Número de janelas de tempo. Padrão: |
|
|
Duração de cada janela de tempo em milissegundos. Padrão: |
Valor de retorno
OKem caso de sucesso.Mensagem de erro em caso de falha.
Exemplo
CPC.ARRAY.UPDATE foo 1645584510000 f1 SIZE 120 WIN 10000
OK
CPC.ARRAY.ESTIMATE
Retorna a estimativa de cardinalidade para a janela de tempo correspondente ao timestamp fornecido.
Sintaxe
CPC.ARRAY.ESTIMATE key timestamp
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave de array TairCpc a consultar. |
|
|
Timestamp UNIX em milissegundos identificando a janela de tempo a consultar. |
Valor de retorno
Estimativa de cardinalidade para a janela de tempo correspondente em caso de sucesso.
Mensagem de erro em caso de falha.
Exemplo
CPC.ARRAY.ESTIMATE foo 1645584532000
"2"
CPC.ARRAY.ESTIMATE.RANGE
Retorna estimativas de cardinalidade por janela para todas as janelas de tempo dentro de um intervalo especificado (intervalo fechado). Cada valor na resposta corresponde a uma janela de tempo.
Sintaxe
CPC.ARRAY.ESTIMATE.RANGE key start_time end_time
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave de array TairCpc a consultar. |
|
|
Início do intervalo de tempo como timestamp UNIX em milissegundos. |
|
|
Fim do intervalo de tempo como timestamp UNIX em milissegundos. |
Valor de retorno
Lista de estimativas de cardinalidade, uma por janela de tempo no intervalo, em caso de sucesso.
Mensagem de erro em caso de falha.
Exemplo
CPC.ARRAY.ESTIMATE.RANGE foo 1645584510000 1645584550000
1) "2"
2) "0"
3) "1"
4) "0"
5) "0"
CPC.ARRAY.ESTIMATE.RANGE.MERGE
Retorna uma única estimativa de cardinalidade mesclada e deduplicada, agregando N janelas de tempo a partir do timestamp fornecido em ordem regressiva.
Use este comando quando precisar de uma contagem única unificada em várias janelas de tempo — por exemplo, total de usuários únicos nos últimos 5 minutos — em vez de contagens por janela individual.
Sintaxe
CPC.ARRAY.ESTIMATE.RANGE.MERGE key timestamp range
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave de array TairCpc a consultar. |
|
|
Ponto inicial da consulta como timestamp UNIX em milissegundos. |
|
|
Número de janelas de tempo a mesclar, contando retroativamente a partir do timestamp. |
Valor de retorno
Estimativa de cardinalidade mesclada e deduplicada em caso de sucesso.
Mensagem de erro em caso de falha.
Exemplo
CPC.ARRAY.ESTIMATE.RANGE.MERGE foo 1645584510000 3
"6"
CPC.ARRAY.UPDATE2EST
Adiciona um item à janela de tempo correspondente ao timestamp fornecido e retorna a estimativa de cardinalidade atualizada para essa janela em uma única ida e volta. Cria a chave se ela não existir.
Usa os mesmos parâmetros de criação de chave que o CPC.ARRAY.UPDATE.
Sintaxe
CPC.ARRAY.UPDATE2EST key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave de array TairCpc a atualizar. |
|
|
Timestamp UNIX em milissegundos identificando a janela de tempo alvo. |
|
|
Item a adicionar. |
|
|
Tempo de expiração relativo em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração relativo em milissegundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em milissegundos. A chave não expira se omitido. |
|
|
Número de janelas de tempo. Padrão: |
|
|
Duração de cada janela de tempo em milissegundos. Padrão: |
Valor de retorno
Estimativa de cardinalidade DOUBLE atualizada para a janela de tempo em caso de sucesso.
Mensagem de erro em caso de falha.
Exemplo
CPC.ARRAY.UPDATE2EST foo 1645584530000 f3
"3"
CPC.ARRAY.UPDATE2JUD
Adiciona um item à janela de tempo correspondente ao timestamp fornecido e retorna tanto a estimativa de cardinalidade atualizada quanto a diferença em relação à estimativa anterior para essa janela. Cria a chave se ela não existir.
Se a diferença retornada for 1, o item era novo (sem duplicata nesta janela).
Se a diferença retornada for 0, o item já existia nesta janela.
Usa os mesmos parâmetros de criação de chave que o CPC.ARRAY.UPDATE.
Sintaxe
CPC.ARRAY.UPDATE2JUD key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Complexidade de tempo: O(1)
Parâmetros
|
Parâmetro |
Descrição |
|
|
Chave de array TairCpc a atualizar. |
|
|
Timestamp UNIX em milissegundos identificando a janela de tempo alvo. |
|
|
Item a adicionar. |
|
|
Tempo de expiração relativo em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em segundos. A chave não expira se omitido. |
|
|
Tempo de expiração relativo em milissegundos. A chave não expira se omitido. |
|
|
Tempo de expiração absoluto como timestamp UNIX em milissegundos. A chave não expira se omitido. |
|
|
Número de janelas de tempo. Padrão: |
|
|
Duração de cada janela de tempo em milissegundos. Padrão: |
Valor de retorno
Em caso de sucesso: dois valores — a estimativa de cardinalidade atualizada para a janela de tempo e, em seguida, a diferença entre as estimativas nova e anterior.
Mensagem de erro em caso de falha.
Exemplo
CPC.ARRAY.UPDATE2JUD foo 1645584530000 f7
1) "8" // New cardinality estimate for this window: 8
2) "1" // Difference: 8 - 7 = 1 (new item)