TairZset (exZset) amplía los conjuntos ordenados de Redis con puntuación multidimensional: permite ordenar miembros por hasta 256 puntuaciones de punto flotante de doble precisión, con prioridad de izquierda a derecha.
Descripción general
Los conjuntos ordenados de Redis solo admiten una única puntuación por miembro, lo que dificulta la clasificación multidimensional. Las soluciones comunes (combinar puntuaciones mediante codificación IEEE 754 o concatenación de cadenas) provocan pérdida de precisión, lógica compleja de codificación y decodificación, e imposibilidad de incrementar de forma atómica las dimensiones individuales de la puntuación.
TairZset resuelve este problema con una estructura de datos multidimensional nativa:
Hasta 256 dimensiones de puntuación por miembro, con el formato
score1#score2#...#scoreNPrioridad de izquierda a derecha: al comparar dos miembros, se compara primero la primera dimensión; si son iguales, se compara la segunda, y así sucesivamente
Incrementos atómicos:
EXZINCRBYincrementa una dimensión específica sin ciclos de lectura-modificación-escrituraCompatibilidad con API: los comandos reflejan los comandos nativos de conjuntos ordenados, por lo que no se requiere lógica de codificación ni decodificación en el cliente
Tablas de clasificación regulares y distribuidas: admite arquitecturas de tablas de clasificación tanto de nodo único como distribuidas
Cliente TairJedis de código abierto: disponible en TairJedis SDK; utilice el código abierto como referencia para implementar clientes en otros lenguajes
El módulo es de código abierto y está disponible en TairZset en GitHub.
Casos de uso
La puntuación multidimensional hace que TairZset sea ideal para cualquier tabla de clasificación donde una sola métrica no sea suficiente:
Tablas de clasificación de streaming: clasifique a los streamers primero por popularidad, luego por "me gusta" y después por monto de regalos —
popularity#likes#gift_amountMedalleros: clasifique a los competidores por medallas de oro, luego plata y finalmente bronce —
gold#silver#bronzeTablas de clasificación de videojuegos: clasifique a los jugadores por puntuación, luego por tiempo de finalización de tareas y después por rango del jugador —
score#completion_time#player_rank
Funcionamiento de la comparación multidimensional
TairZset compara las puntuaciones dimensión por dimensión, de izquierda a derecha. Considere una puntuación de dos dimensiones score1#score2:
0#99vs99#90vs99#99: dado que0 < 99, el resultado es0#99 < 99#90 < 99#99Considere
#como un punto decimal:0.99 < 99.90 < 99.99
Si todas las dimensiones son iguales, TairZset ordena por nombre de miembro en orden ASCII.
Requisitos previos
Antes de empezar, asegúrese de contar con:
Una instancia de Tair memory-optimized instance
Para instancias optimizadas para memoria compatibles con Redis 5.0: versión menor 1.7.1 o posterior
Actualice a la versión menor más reciente para obtener la mayor cantidad de funciones y la máxima estabilidad. Consulte Actualizar la versión menor de una instancia . En instancias de clúster o instancias con división de lectura/escritura, actualice también los nodos proxy para garantizar que todos los comandos se ejecuten correctamente.
Notas de uso
Todos los comandos de TairZset operan sobre datos de TairZset en instancias de Tair. Ejecutar estos comandos sobre una clave que contiene un tipo de dato diferente devuelve un error.
Consistencia en el formato de puntuación: todos los miembros de la misma clave deben usar el mismo número de dimensiones de puntuación. Mezclar
1#2#3y1#2en la misma clave genera un error.Formato de incremento: el parámetro
incrementenEXZINCRBYdebe coincidir con el formato de dimensión de puntuación del miembro destino. Para incrementar solo una dimensión de una puntuación de tres dimensiones, especifique las tres dimensiones (por ejemplo,EXZINCRBY key 0#1#0 member).+infy-infson valores de puntuación válidos en todos los comandos de rango de puntuación.
Inicio rápido
El siguiente ejemplo construye una tabla de clasificación de streaming bidimensional: clasifica primero por popularidad y luego por "me gusta".
# Add streamers with initial scores (popularity#likes)
EXZADD leaderboard 1000#500 alice 800#900 bob 1000#300 carol
# Atomically increment alice's likes without a read-modify-write cycle
EXZINCRBY leaderboard 0#100 alice
# Get the full leaderboard, highest score first
EXZREVRANGE leaderboard 0 -1 WITHSCORES
# 1) "alice"
# 2) "1000#600"
# 3) "carol"
# 4) "1000#300"
# 5) "bob"
# 6) "800#900"
# Get alice's rank (highest = rank 0)
EXZREVRANK leaderboard alice
# (integer) 0
Comandos
La siguiente tabla enumera todos los comandos de TairZset. Utilice el comando nativo de Redis DEL para eliminar claves de TairZset.
|
Comando |
Sintaxis |
Complejidad |
Descripción |
|
|
|
XX] [CH] [INCR] score member [score member ...]` |
O(M\*log(N)) |
Agrega o actualiza miembros con puntuaciones |
|
|
|
O(log(N)) |
Incrementa la puntuación de un miembro |
||
|
|
O(1) |
Obtiene la puntuación de un miembro |
||
|
|
O(log(N)+M) |
Devuelve miembros por rango de índice, de menor a mayor |
||
|
|
O(log(N)+M) |
Devuelve miembros por rango de índice, de mayor a menor |
||
|
|
O(log(N)+M) |
Devuelve miembros por rango de puntuación, de menor a mayor |
||
|
|
O(log(N)+M) |
Devuelve miembros por rango de puntuación, de mayor a menor |
||
|
|
O(log(N)+M) |
Devuelve miembros por rango lexicográfico |
||
|
|
O(log(N)+M) |
Devuelve miembros por rango lexicográfico, en orden inverso |
||
|
|
O(M\*log(N)) |
Elimina miembros |
||
|
|
O(log(N)+M) |
Elimina miembros por rango de puntuación |
||
|
|
O(log(N)+M) |
Elimina miembros por rango de posición |
||
|
|
O(log(N)+M) |
Elimina miembros por rango lexicográfico |
||
|
|
O(1) |
Devuelve el número de miembros |
||
|
|
O(log(N)) |
Devuelve la posición de un miembro, de menor a mayor |
||
|
|
O(log(N)) |
Devuelve la posición de un miembro, de mayor a menor |
||
|
|
O(log(N)) |
Cuenta miembros dentro de un rango de puntuación |
||
|
|
O(log(N)) |
Cuenta miembros dentro de un rango lexicográfico |
||
|
|
O(log(N)) |
Devuelve la posición de una puntuación, de menor a mayor |
||
|
|
O(log(N)) |
Devuelve la posición de una puntuación, de mayor a menor |
||
|
|
— |
Elimina una o más claves de TairZset |
Convenciones de sintaxis utilizadas en este tema:
UPPERCASE KEYWORD: palabra clave del comando_italic_: variable[option]: parámetro opcionalA|B: opciones mutuamente excluyentes (elija una)...: el parámetro anterior puede repetirse
EXZADD
|
Categoría |
Detalles |
|
|
Sintaxis |
|
XX] [CH] [INCR] score member [score member ...]` |
|
Complejidad |
O(M\*log(N)), donde N es el número de miembros en la clave y M es el número de miembros agregados o actualizados |
|
|
Descripción |
Agrega miembros con puntuaciones a una clave de TairZset o actualiza las puntuaciones de miembros existentes. |
Comportamiento:
Si la clave no existe, se crea.
Si un miembro no existe, se agrega con la puntuación indicada.
Si un miembro ya existe, su puntuación se sobrescribe (a menos que se especifique
NX).Cada puntuación es una representación en cadena de un número de punto flotante de doble precisión.
+infy-infson valores válidos.
Para usar puntuación multidimensional, separe cada dimensión con#, por ejemplo111#222#121. Todos los miembros de la clave deben usar el mismo número de dimensiones.
Opciones:
|
Opción |
Descripción |
|
|
Agrega solo miembros nuevos; omite los existentes |
|
|
Actualiza solo miembros existentes; omite los nuevos |
|
|
Cambia el valor de retorno del recuento de miembros recién agregados al recuento de todos los miembros modificados (agregados o con puntuación actualizada) |
|
|
Trata la puntuación como un incremento, lo que hace que |
Valor de retorno:
Sin opciones: el número de miembros recién agregados (no se cuentan los miembros que solo tuvieron actualización de puntuación)
Con
CH: el número de miembros agregados o cuya puntuación cambióCon
INCR: la nueva puntuación del miembro como cadena (por ejemplo,"2#0#6"); devuelvenilsi la operación se omite debido aNXoXX
Ejemplo:
EXZADD testkey NX 1#0#3 a 1#0#2 b
(integer) 2
EXZINCRBY
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)) |
|
Descripción |
Incrementa la puntuación de un miembro en una clave de TairZset. |
Comportamiento:
Si la clave o el miembro no existen, ambos se crean con la puntuación establecida en
increment.Si el miembro existe, su puntuación se incrementa en
increment.Cada dimensión de puntuación es un número de punto flotante de doble precisión.
+infy-infson valores válidos.Para disminuir una puntuación, pase un valor negativo en
increment.
Para puntuaciones multidimensionales,incrementdebe usar el mismo formato que la puntuación del miembro. Por ejemplo, para incrementar solo la segunda dimensión de una puntuación de tres dimensiones, use0#1#0.
Valor de retorno: La nueva puntuación del miembro como cadena. Para puntuaciones multidimensionales, el formato es "score1#score2#..." (por ejemplo, "2#0#6").
Ejemplo:
EXZINCRBY testkey 2#2#1 a
"3#2#4"
EXZSCORE
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(1) |
|
Descripción |
Devuelve la puntuación de un miembro en una clave de TairZset. Devuelve |
Valor de retorno: La puntuación del miembro como cadena. Para puntuaciones multidimensionales, el formato es "score1#score2#..." (por ejemplo, "3#2#4").
Ejemplo:
EXZSCORE testkey a
"3#2#4"
EXZRANGE
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad devuelta |
|
Descripción |
Devuelve miembros dentro de un rango de índices, ordenados por puntuación de menor a mayor. |
Opciones:
|
Opción |
Descripción |
|
|
Valores de índice base cero. |
|
|
Incluye las puntuaciones en la respuesta. El formato alterna miembro y puntuación: |
Return value: Una lista de miembros dentro del rango especificado, con puntuaciones si se especifica WITHSCORES.
Ejemplo:
EXZRANGE testkey 0 -1 WITHSCORES
1) "b"
2) "1#0#2"
3) "a"
4) "3#2#4"
EXZREVRANGE
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad devuelta |
|
Descripción |
Devuelve miembros dentro de un rango de índices, ordenados por puntuación de mayor a menor. Los miembros con la misma puntuación se ordenan en orden lexicográfico inverso. Igual que EXZRANGE, excepto por la dirección de ordenamiento. |
Opciones:
|
Opción |
Descripción |
|
|
Valores de índice base cero. |
|
|
Incluye las puntuaciones en la respuesta. |
Return value: Una lista de miembros dentro del rango especificado, con puntuaciones si se especifica WITHSCORES.
Ejemplo:
EXZREVRANGE testkey 0 -1 WITHSCORES
1) "a"
2) "3#2#4"
3) "b"
4) "1#0#2"
EXZRANGEBYSCORE
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad devuelta. Cuando M es constante (por ejemplo, al usar |
|
Descripción |
Devuelve todos los miembros con puntuaciones entre |
Opciones:
|
Opción |
Descripción |
|
|
Puntuaciones mínima y máxima. Para puntuaciones multidimensionales, use |
|
|
Incluye las puntuaciones en la respuesta. |
|
|
Limita el resultado a |
Return value: Una lista de miembros dentro del rango de puntuación, con puntuaciones si se especifica WITHSCORES.
Ejemplo:
EXZRANGEBYSCORE testkey 0#0#0 6#6#6 WITHSCORES
1) "b"
2) "1#0#2"
3) "a"
4) "3#2#4"
EXZREVRANGEBYSCORE
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad devuelta. Cuando M es constante (por ejemplo, al usar |
|
Descripción |
Devuelve todos los miembros con puntuaciones entre |
Opciones:
|
Opción |
Descripción |
|
|
Puntuaciones máxima y mínima (tenga en cuenta el orden inverso de los argumentos). Para puntuaciones multidimensionales, use |
|
|
Incluye las puntuaciones en la respuesta. |
|
|
Limita el resultado a |
Return value: Una lista de miembros dentro del rango de puntuación, con puntuaciones si se especifica WITHSCORES.
Ejemplo:
EXZREVRANGEBYSCORE testkey 6#6#6 0#0#0 WITHSCORES
1) "a"
2) "3#2#4"
3) "b"
4) "1#0#2"
EXZRANGEBYLEX
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad devuelta. Cuando M es constante, la complejidad es O(log(N)). |
|
Descripción |
Devuelve miembros cuyos nombres se encuentran entre |
Si los miembros tienen puntuaciones diferentes, el conjunto devuelto es indefinido. La comparación lexicográfica utiliza la función memcmp() de C, que compara bytes uno por uno. Si dos cadenas comparten un prefijo común, la cadena más larga tiene una posición superior.
Opciones:
|
Opción |
Descripción |
|
|
Límites de nombre de miembro. Anteponga |
|
|
Limita el resultado a |
Return value: Una lista de miembros dentro del rango lexicográfico.
Ejemplo:
EXZRANGEBYLEX zzz [a [b
1) "aba"
2) "abc"
EXZREVRANGEBYLEX
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad devuelta. Cuando M es constante, la complejidad es O(log(N)). |
|
Descripción |
Devuelve miembros en el rango lexicográfico entre |
Opciones:
|
Opción |
Descripción |
|
|
Límites de nombre de miembro (tenga en cuenta el orden inverso de los argumentos). Anteponga |
|
|
Limita el resultado a |
Return value: Una lista de miembros dentro del rango lexicográfico, en orden inverso.
Ejemplo:
EXZREVRANGEBYLEX zzz [b [a
1) "abc"
2) "aba"
EXZREM
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(M\*log(N)), donde N es el número de miembros y M es el número de miembros por eliminar |
|
Descripción |
Elimina los miembros especificados de una clave de TairZset. Los miembros inexistentes se ignoran silenciosamente. Devuelve un error si la clave existe pero contiene un tipo de dato diferente. |
Valor de retorno: El número de miembros eliminados (sin contar los miembros inexistentes).
Ejemplo:
EXZREM testkey a
(integer) 1
EXZREMRANGEBYSCORE
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad eliminada |
|
Descripción |
Elimina todos los miembros con puntuaciones entre |
Opciones:
|
Opción |
Descripción |
|
|
Límites de puntuación. Para puntuaciones multidimensionales, use |
Valor de retorno: El número de miembros eliminados.
Ejemplo:
EXZREMRANGEBYSCORE testkey 3#2#4 6#6#6
(integer) 1
EXZREMRANGEBYRANK
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad eliminada |
|
Descripción |
Elimina todos los miembros con posiciones entre |
Opciones:
|
Opción |
Descripción |
|
|
Valores de posición base cero, donde 0 es el miembro con la puntuación más baja. Los valores negativos cuentan desde la puntuación más alta: |
Valor de retorno: El número de miembros eliminados.
Ejemplo:
EXZREMRANGEBYRANK testkey 0 1
(integer) 1
EXZREMRANGEBYLEX
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)+M), donde N es el número de miembros y M es la cantidad eliminada |
|
Descripción |
Elimina miembros cuyos nombres se encuentran entre |
Opciones:
|
Opción |
Descripción |
|
|
Límites de nombre de miembro. Anteponga |
Valor de retorno: El número de miembros eliminados.
Ejemplo:
EXZREMRANGEBYLEX testkey [a [b
(integer) 2
EXZCARD
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(1) |
|
Descripción |
Devuelve el número de miembros en una clave de TairZset. Devuelve 0 si la clave no existe. |
Valor de retorno: El número de miembros (entero).
Ejemplo:
EXZCARD testkey
(integer) 2
EXZRANK
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)) |
|
Descripción |
Devuelve la posición de un miembro, asignando la posición 0 al miembro con la puntuación más baja (orden ascendente). |
Valor de retorno:
La posición del miembro (entero) si el miembro existe
nilsi la clave o el miembro no existen
Ejemplo:
EXZRANK testkey b
(integer) 0
EXZREVRANK
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)) |
|
Descripción |
Devuelve la posición de un miembro, asignando la posición 0 al miembro con la puntuación más alta (orden descendente). Igual que EXZRANK pero en orden inverso. |
Valor de retorno:
La posición del miembro (entero) si el miembro existe
nilsi la clave o el miembro no existen
Ejemplo:
EXZREVRANK testkey b
(integer) 1
EXZCOUNT
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)), donde N es el número de miembros. El trabajo es proporcional al número de elementos recorridos a nivel de índice, no al tamaño del rango de puntuación. |
|
Descripción |
Devuelve el número de miembros con puntuaciones entre |
Opciones:
|
Opción |
Descripción |
|
|
Límites de puntuación. Para puntuaciones multidimensionales, use |
Valor de retorno: El número de miembros dentro del rango de puntuación (entero).
Ejemplo:
EXZCOUNT testkey (1#0#2 6#6#6
(integer) 1
EXZLEXCOUNT
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)), donde N es el número de miembros. El trabajo es proporcional al número de elementos recorridos a nivel de índice. |
|
Descripción |
Devuelve el número de miembros con nombres entre |
Si los miembros tienen puntuaciones diferentes, el resultado es indefinido. La comparación lexicográfica utiliza la función memcmp() de C. Si dos cadenas comparten un prefijo común, la cadena más larga tiene una posición superior.
Opciones:
|
Opción |
Descripción |
|
|
Límites de nombre de miembro. Anteponga |
Valor de retorno: El número de miembros dentro del rango lexicográfico (entero).
Ejemplo:
EXZLEXCOUNT zzz [a [b
(integer) 2
EXZRANKBYSCORE
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)) |
|
Descripción |
Devuelve la posición que ocuparía una puntuación dada en la clave, ordenada de menor a mayor (posición 0 = puntuación más baja). Si la puntuación no existe, devuelve su posición estimada. Si la puntuación ya existe, la posición se calcula como si la nueva puntuación se insertara antes de la existente. |
Valor de retorno: La posición de la puntuación especificada (entero).
Ejemplo:
EXZRANKBYSCORE testkey 2#0#2
(integer) 1
EXZREVRANKBYSCORE
|
Categoría |
Detalles |
|
Sintaxis |
|
|
Complejidad |
O(log(N)) |
|
Descripción |
Devuelve la posición que ocuparía una puntuación dada en la clave, ordenada de mayor a menor (posición 0 = puntuación más alta). Si la puntuación no existe, devuelve su posición estimada. Si la puntuación ya existe, la posición se calcula como si la nueva puntuación se insertara después de la existente. |
Valor de retorno: La posición de la puntuación especificada (entero).
Ejemplo:
EXZREVRANKBYSCORE testkey 2#0#2
(integer) 1