TairCpc es una estructura de datos basada en el sketch de conteo de probabilidad comprimida (CPC). Ofrece estimaciones de cardinalidad con alta precisión y un consumo de memoria significativamente menor que HyperLogLog (HLL), lo que la hace ideal para la deduplicación en tiempo real dentro de flujos de datos de alto rendimiento.
Contexto
Los sistemas de toma de decisiones en tiempo real procesan eventos de negocio conforme llegan, almacenan los resultados para un acceso rápido y aplican reglas para actuar de inmediato. A continuación se presentan dos ejemplos donde el conteo de cardinalidad con baja latencia es fundamental:
Prevención de fraude con tarjetas de crédito: Determinar si una tarjeta se utiliza en un contexto sospechoso y detener las transacciones inusuales a la brevedad posible.
Prevención de reventa de boletos: Detectar y detener bots que usan dispositivos virtuales y direcciones IP falsas antes de que adquieran inventario.
TairCpc le permite deduplicar los datos entrantes por dimensión, almacenar el sketch en una instancia de Tair y ejecutar consultas de agregación en nanosegundos, con lo cual combina almacenamiento y cómputo en una sola capa.
Descripción general
CPC cuenta valores distintos en un flujo de datos y admite la fusión de varios sketches para obtener un total combinado. En comparación con HLL, CPC logra la misma precisión con aproximadamente un 40 % menos de memoria.
TairCpc amplía la implementación de código abierto de CPC y reduce la tasa de error al 0.008%, frente al 0.67% del CPC estándar y al 1.95% de HLL.
Considere TairCpc como una alternativa eficiente en memoria a un Set para contar elementos únicos:
|
Operación |
Equivalente en Set |
Equivalente en TairCpc |
|
Agregar un elemento |
|
|
|
Contar elementos únicos |
|
|
A diferencia de un Set, TairCpc no almacena los elementos sin procesar, sino un sketch compacto que aproxima el conteo. Esta compensación permite realizar agregaciones en menos de un milisegundo a gran escala.
Funciones principales
Bajo consumo de memoria con lecturas y escrituras incrementales, además de E/S mínima
Deduplicación de alto rendimiento y precisión extremadamente alta
Tasa de error reducida del 0.008% (frente al 0.67% del CPC de código abierto y al 1.95% de HLL)
Casos de uso
Sistemas de seguridad bancaria: ¿Cuántas cuentas o dispositivos distintos han realizado una acción específica en el último minuto?
Ventas flash: ¿Cuántos usuarios únicos han intentado comprar este artículo en la ventana de tiempo actual?
Prevención de reventa de boletos: ¿Cuántas direcciones IP distintas han enviado solicitudes desde esta sesión en los últimos 10 segundos?
Requisitos previos
Antes de empezar, asegúrese de que su instancia corresponda a uno de los siguientes tipos de la serie Tair:
Instancia DRAM-based. Si la instancia es compatible con Redis 5.0, la versión secundaria debe ser la 1.7.20 o posterior.
Instancia Persistent memory-optimized con versión secundaria 1.2.3.3 o posterior.
Mantenga su instancia en la versión secundaria más reciente para obtener la mayor cantidad de funciones y la máxima estabilidad. Para consultar las instrucciones de actualización, consulte Actualizar la versión secundaria de una instancia . En el caso de instancias de clúster e instancias con división de lectura/escritura, actualice también los nodos proxy a la versión secundaria más reciente para garantizar que todos los comandos se ejecuten correctamente.
Notas de uso
Los datos de TairCpc se almacenan en una instancia de Tair.
Comandos compatibles
|
Comando |
Sintaxis |
Descripción |
|||
|
|
EXAT |
PX |
PXAT time]` |
Agrega un elemento a una clave. Crea la clave si no existe. No realiza ninguna acción si el elemento ya existe. |
|
|
|
Devuelve la estimación de cardinalidad deduplicada para una clave como un valor DOUBLE. |
||||
|
|
EXAT |
PX |
PXAT time]` |
Agrega un elemento y devuelve la estimación DOUBLE actualizada. Crea la clave si no existe. |
|
|
|
EXAT |
PX |
PXAT time]` |
Agrega un elemento y devuelve la estimación actualizada junto con la diferencia. Utilice la diferencia para detectar duplicados: 1 = elemento nuevo, 0 = duplicado. |
|
|
|
EXAT |
PX |
PXAT time] [SIZE size] [WIN window_length]` |
Agrega un elemento a la ventana de tiempo correspondiente a la marca de tiempo indicada. |
|
|
|
Devuelve la estimación de cardinalidad para la ventana de tiempo correspondiente a la marca de tiempo indicada. |
||||
|
|
Devuelve estimaciones de cardinalidad por ventana a lo largo de un intervalo de tiempo (intervalo cerrado). |
||||
|
|
Devuelve la estimación fusionada y deduplicada a partir de una marca de tiempo, abarcando N ventanas de tiempo hacia atrás. |
||||
|
|
EXAT |
PX |
PXAT time] [SIZE size] [WIN window_length]` |
Agrega un elemento a una ventana de tiempo y devuelve la estimación actualizada para dicha ventana. |
|
|
|
EXAT |
PX |
PXAT time] [SIZE size] [WIN window_length]` |
Agrega un elemento a una ventana de tiempo y devuelve la estimación actualizada y la diferencia para dicha ventana. |
|
|
|
Elimina una o más claves de TairCpc. |
Convenciones de sintaxis
MAYÚSCULAS: palabra clave del comando_cursiva_: variable[opción]: parámetro opcionalA|B: opciones mutuamente excluyentes; especifique solo una...: el parámetro anterior puede repetirse
CPC.UPDATE
Agrega un elemento a una clave de TairCpc. Crea la clave si no existe. Si el elemento ya existe, el comando no realiza ninguna acción.
Sintaxis
CPC.UPDATE key item [EX|EXAT|PX|PXAT time]
Complejidad temporal O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de TairCpc que se actualizará. |
|
|
El elemento que se agregará. |
|
|
Tiempo de expiración relativo en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración relativo en milisegundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en milisegundos. La clave no expira si se omite. |
Valor devuelto
OKen caso de éxito.Un mensaje de error en caso contrario.
Ejemplo
CPC.UPDATE foo f1 EX 3600
OK
CPC.ESTIMATE
Devuelve la estimación de cardinalidad de una clave de TairCpc después de la deduplicación. El valor devuelto es de tipo DOUBLE; redondéelo al entero más cercano para obtener un conteo utilizable.
Sintaxis
CPC.ESTIMATE key
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de TairCpc que se consultará. |
Valor devuelto
La estimación de cardinalidad de tipo DOUBLE en caso de éxito.
Un mensaje de error en caso contrario.
Ejemplo
CPC.ESTIMATE foo
"19.000027716212127"
CPC.UPDATE2EST
Agrega un elemento a una clave de TairCpc y devuelve la estimación de cardinalidad actualizada en un solo ciclo de solicitud-respuesta. Crea la clave si no existe.
Sintaxis
CPC.UPDATE2EST key item [EX|EXAT|PX|PXAT time]
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de TairCpc que se actualizará. |
|
|
El elemento que se agregará. |
|
|
Tiempo de expiración relativo en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración relativo en milisegundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en milisegundos. La clave no expira si se omite. |
Valor devuelto
La estimación de cardinalidad de tipo DOUBLE tras la actualización, en caso de éxito.
Un mensaje de error en caso contrario.
Ejemplo
CPC.UPDATE2EST foo f3
"3.0000004768373003"
CPC.UPDATE2JUD
Agrega un elemento a una clave de TairCpc y devuelve tanto la estimación de cardinalidad actualizada como la diferencia respecto a la estimación anterior. Utilice la diferencia para determinar si el elemento era nuevo o ya existía, sin necesidad de un comando de lectura adicional.
Si se devuelve una diferencia de 1, el elemento era nuevo (sin duplicados).
Si se devuelve una diferencia de 0, el elemento ya existía (duplicado detectado).
Crea la clave si no existe.
Sintaxis
CPC.UPDATE2JUD key item [EX|EXAT|PX|PXAT time]
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de TairCpc que se actualizará. |
|
|
El elemento que se agregará. |
|
|
Tiempo de expiración relativo en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración relativo en milisegundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en milisegundos. La clave no expira si se omite. |
Valor devuelto
En caso de éxito: dos valores DOUBLE —la nueva estimación de cardinalidad y luego la diferencia entre la estimación nueva y la anterior—.
Un mensaje de error en caso contrario.
Ejemplo
CPC.UPDATE2JUD foo f20
1) "20.000027716212127" // New cardinality estimate: 20
2) "1.0000014901183398" // Difference: 20 - 19 = 1 (new item)
CPC.ARRAY.UPDATE
Agrega un elemento a una clave de matriz de TairCpc dentro de la ventana de tiempo correspondiente a la marca de tiempo indicada. Crea la clave si no existe.
Una clave de matriz de TairCpc mantiene una ventana deslizante de sketches CPC. Cada llamada escribe datos en la ventana de tiempo que coincide con la marca de tiempo. El intervalo de tiempo observable total es de SIZE × WIN milisegundos. Los datos fuera de este intervalo se sobrescriben conforme llegan nuevos datos.
SIZEyWINsolo se aplican cuando la clave se crea por primera vez. Las escrituras posteriores en la misma clave utilizan los valores establecidos al momento de la creación.
Ejemplo: Para rastrear eventos únicos por minuto durante los últimos 10 minutos, establezca SIZE en 10 y WIN en 60000. Cuando llegan datos del minuto 11, los datos del primer minuto se sobrescriben.
Sintaxis
CPC.ARRAY.UPDATE key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de matriz de TairCpc que se actualizará. |
|
|
Marca de tiempo UNIX en milisegundos que indica en qué ventana de tiempo se escribirá. |
|
|
El elemento que se agregará. |
|
|
Tiempo de expiración relativo en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración relativo en milisegundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en milisegundos. La clave no expira si se omite. |
|
|
Número de ventanas de tiempo. Valor predeterminado: |
|
|
Duración de cada ventana de tiempo en milisegundos. Valor predeterminado: |
Valor devuelto
OKen caso de éxito.Un mensaje de error en caso contrario.
Ejemplo
CPC.ARRAY.UPDATE foo 1645584510000 f1 SIZE 120 WIN 10000
OK
CPC.ARRAY.ESTIMATE
Devuelve la estimación de cardinalidad para la ventana de tiempo correspondiente a la marca de tiempo indicada.
Sintaxis
CPC.ARRAY.ESTIMATE key timestamp
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de matriz de TairCpc que se consultará. |
|
|
Marca de tiempo UNIX en milisegundos que identifica la ventana de tiempo a consultar. |
Valor devuelto
La estimación de cardinalidad para la ventana de tiempo correspondiente, en caso de éxito.
Un mensaje de error en caso contrario.
Ejemplo
CPC.ARRAY.ESTIMATE foo 1645584532000
"2"
CPC.ARRAY.ESTIMATE.RANGE
Devuelve estimaciones de cardinalidad por ventana para todas las ventanas de tiempo dentro de un intervalo especificado (intervalo cerrado). Cada valor en la respuesta corresponde a una ventana de tiempo.
Sintaxis
CPC.ARRAY.ESTIMATE.RANGE key start_time end_time
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de matriz de TairCpc que se consultará. |
|
|
Inicio del intervalo de tiempo como marca de tiempo UNIX en milisegundos. |
|
|
Fin del intervalo de tiempo como marca de tiempo UNIX en milisegundos. |
Valor devuelto
Una lista de estimaciones de cardinalidad, una por cada ventana de tiempo en el intervalo, en caso de éxito.
Un mensaje de error en caso contrario.
Ejemplo
CPC.ARRAY.ESTIMATE.RANGE foo 1645584510000 1645584550000
1) "2"
2) "0"
3) "1"
4) "0"
5) "0"
CPC.ARRAY.ESTIMATE.RANGE.MERGE
Devuelve una única estimación de cardinalidad fusionada y deduplicada, que agrega N ventanas de tiempo a partir de la marca de tiempo indicada y en sentido retrospectivo.
Utilice este comando cuando necesite un conteo único unificado a través de varias ventanas de tiempo —por ejemplo, el total de usuarios únicos en los últimos 5 minutos— en lugar de conteos por ventana individual.
Sintaxis
CPC.ARRAY.ESTIMATE.RANGE.MERGE key timestamp range
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de matriz de TairCpc que se consultará. |
|
|
Punto de inicio de la consulta como marca de tiempo UNIX en milisegundos. |
|
|
Número de ventanas de tiempo para fusionar, contando hacia atrás desde la marca de tiempo. |
Valor devuelto
La estimación de cardinalidad fusionada y deduplicada, en caso de éxito.
Un mensaje de error en caso contrario.
Ejemplo
CPC.ARRAY.ESTIMATE.RANGE.MERGE foo 1645584510000 3
"6"
CPC.ARRAY.UPDATE2EST
Agrega un elemento a la ventana de tiempo correspondiente a la marca de tiempo indicada y devuelve la estimación de cardinalidad actualizada para esa ventana en un solo ciclo de solicitud-respuesta. Crea la clave si no existe.
Utiliza los mismos parámetros de creación de claves que CPC.ARRAY.UPDATE.
Sintaxis
CPC.ARRAY.UPDATE2EST key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de matriz de TairCpc que se actualizará. |
|
|
Marca de tiempo UNIX en milisegundos que identifica la ventana de tiempo destino. |
|
|
El elemento que se agregará. |
|
|
Tiempo de expiración relativo en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración relativo en milisegundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en milisegundos. La clave no expira si se omite. |
|
|
Número de ventanas de tiempo. Valor predeterminado: |
|
|
Duración de cada ventana de tiempo en milisegundos. Valor predeterminado: |
Valor devuelto
La estimación de cardinalidad DOUBLE actualizada para la ventana de tiempo, en caso de éxito.
Un mensaje de error en caso contrario.
Ejemplo
CPC.ARRAY.UPDATE2EST foo 1645584530000 f3
"3"
CPC.ARRAY.UPDATE2JUD
Agrega un elemento a la ventana de tiempo correspondiente a la marca de tiempo indicada y devuelve tanto la estimación de cardinalidad actualizada como la diferencia respecto a la estimación anterior para esa ventana. Crea la clave si no existe.
Si se devuelve una diferencia de 1, el elemento era nuevo (sin duplicados en esta ventana).
Si se devuelve una diferencia de 0, el elemento ya existía en esta ventana.
Utiliza los mismos parámetros de creación de claves que CPC.ARRAY.UPDATE.
Sintaxis
CPC.ARRAY.UPDATE2JUD key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Complejidad temporal: O(1)
Parámetros
|
Parámetro |
Descripción |
|
|
La clave de matriz de TairCpc que se actualizará. |
|
|
Marca de tiempo UNIX en milisegundos que identifica la ventana de tiempo destino. |
|
|
El elemento que se agregará. |
|
|
Tiempo de expiración relativo en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en segundos. La clave no expira si se omite. |
|
|
Tiempo de expiración relativo en milisegundos. La clave no expira si se omite. |
|
|
Tiempo de expiración absoluto como marca de tiempo UNIX en milisegundos. La clave no expira si se omite. |
|
|
Número de ventanas de tiempo. Valor predeterminado: |
|
|
Duración de cada ventana de tiempo en milisegundos. Valor predeterminado: |
Valor devuelto
En caso de éxito: dos valores —la estimación de cardinalidad actualizada para la ventana de tiempo y luego la diferencia entre la estimación nueva y la anterior—.
Un mensaje de error en caso contrario.
Ejemplo
CPC.ARRAY.UPDATE2JUD foo 1645584530000 f7
1) "8" // New cardinality estimate for this window: 8
2) "1" // Difference: 8 - 7 = 1 (new item)