¿Cuál es la mejor manera de obtener la suma de PUNTUACIONES en un conjunto ordenado de Redis?Redis: Suma de PUNTUACIONES en conjunto ordenado
Respuesta
La única opción que creo es iterar el conjunto ordenado y calcular el lado del cliente de suma.
Si los conjuntos son pequeños, y no necesita un rendimiento excelente, simplemente iteraría (zrange/zrangebyscore) y sumaría los valores del lado del cliente.
Si, por otro lado, está hablando de muchos miles: millones de elementos, siempre puede mantener un conjunto de referencia con totales acumulados para cada usuario y aumentarlos/disminuirlos a medida que se envían los regalos.
Así que cuando usted hace su ZINCR 123:gifts 1 "3|345"
, se podría hacer una orden ZINCR independiente, que podría ser algo como esto:
ZINCR received-gifts 1 <user_id>
Entonces, para obtener el # de los dones recibidos para un usuario determinado, sólo tiene para ejecutar un Zscore:
ZSCORE received-gifts <user_id>
El conteo incremental gana de lejos por problemas en línea. El análisis solo debe usarse en algoritmos fuera de línea, en mi humilde opinión, ya que nadie puede predecir el futuro crecimiento de los conjuntos de datos. Esta respuesta debería ser la aceptada. Ah, y btw: uno podría escribir un comando personalizado que hace ambas cosas (agregar a un conjunto e incrementar el contador, actualizar un valor y ajustar el contador, eliminar del conjunto & ...) –
Disponible desde Redis v2.6 es la capacidad más impresionante para ejecutar scripts Lua en el servidor Redis. Esto hace que el reto de sumar las puntuaciones de un conjunto ordenado de trivial:
local sum=0
local z=redis.call('ZRANGE', KEYS[1], 0, -1, 'WITHSCORES')
for i=2, #z, 2 do
sum=sum+z[i]
end
return sum
Runtime ejemplo:
~$ redis-cli zadd z 1 a 2 b 3 c 4 d 5 e
(integer) 5
~$ redis-cli eval "local sum=0 local z=redis.call('ZRANGE', KEYS[1], 0, -1, 'WITHSCORES') for i=2, #z, 2 do sum=sum+z[i] end return sum" 1 z
(integer) 15
Una nota importante es que el servidor Redis -side lua scripts bloquea TODO, lo que puede ser un obstáculo en la mayoría de los casos. Fuente: http://stackoverflow.com/a/30896608/2440 – Sire
Aquí es un pequeño script lua que mantiene la puntuación total zConfigurar a medida que avanza, en un contador con la clave postfijada con '.ss'. Puedes usarlo en lugar de ZADD.
local delta = 0
for i=1,#ARGV,2 do
local oldScore = redis.call('zscore', KEYS[1], ARGV[i+1])
if oldScore == false then
oldScore = 0
end
delta = delta - oldScore + ARGV[i]
end
local val = redis.call('zadd', KEYS[1], unpack(ARGV))
redis.call('INCRBY', KEYS[1]..'.ss', delta)
Ese script no debe construir la clave dentro de lua ('KEYS [1] .. '. Ss''), que" viola la semántica del comando EVAL como todas las las claves que usa la secuencia de comandos se deben pasar usando la matriz KEYS "- https://redis.io/commands/eval – Jonathan
@Jonathan tiene razón, la clave para la puntuación total también debe aprobarse en las LLAVES [] – Patrick
- 1. inversa paginación a través de un Redis Ordenado Conjunto
- 2. ¿Existe un límite práctico para la cantidad de elementos en un conjunto ordenado en redis?
- 3. Cualquier implementación de conjunto ordenado en Java?
- 4. STL + Conjunto ordenado + sin duplicados
- 5. Número entero más grande de PHP a partir de la suma del conjunto no ordenado
- 6. Obtener todos los miembros en el conjunto ordenado
- 7. ¿Cómo determinar si algo es miembro de un conjunto ordenado?
- 8. redis structure, performance
- 9. Buscar la suma máxima de elementos en el conjunto
- 10. Buscando un comando copiar conjunto (o alternativa) en Redis
- 11. Redis: implementar gráfico dirigido ponderado
- 12. Obtenga una gama de teclas con redis?
- 13. postgresql calcule la suma de un conjunto de resultados
- 14. ¿Por qué la suma de un conjunto vacío es nula?
- 15. Asignación de un conjunto de puntos 3D a otro conjunto con suma mínima de distancias
- 16. ¿Cómo normalizar las puntuaciones de Lucene?
- 17. hash ordenado en JavaScript
- 18. Inserte el resultado de ZRANGEBYSCORE en un conjunto
- 19. Encuentra de manera dinámica piónica los elementos mínimos en un conjunto parcialmente ordenado
- 20. Puntuaciones de deportes en tiempo real de un servicio web?
- 21. ¿Cómo convertir una lista o un vector en un conjunto ordenado en Clojure?
- 22. redis: establecer una contraseña para redis
- 23. Diccionario revertido ordenado en .NET
- 24. ¿Cómo puedo nombrar y almacenar mi conjunto de datos en redis?
- 25. Agregar una fila individual superior al resultado ordenado Conjunto de una consulta
- 26. Buscar conjunto de números en una colección que se suma a un número en otra
- 27. La forma más rápida de calcular la suma de bits en el conjunto de bytes
- 28. cálculo de las puntuaciones de las tablas de clasificación incompletas
- 29. Redis y Memcache o solo Redis?
- 30. Ingesta masiva en Redis
gracias! Sí, creo que esto es probablemente demasiado específico de una característica para que Redis se moleste en implementar ... esp. ya que puede que ni siquiera esté haciendo algo recomendable. Estoy usando un zset para almacenar los ID de regalo recibidos de un usuario y los ID de usuario de envío y el puntaje es el número de veces que se ha recibido el mismo regalo del mismo remitente. Por ejemplo, 'ZINCR 123: regalos 1" 3 | 345 "' envía el regalo w id 3 del usuario 345 al usuario 123. Por lo tanto, quiero obtener el total de regalos que ha recibido un usuario. ¿Ver? Tal vez hay una mejor manera de implementar esto? Es como Facebook Gift API. ¡Redis gobierna! :) ¡Gracias por todo! – ma11hew28