Qual è il modo migliore per ottenere la somma di PUNTEGGI in un set ordinato Redis?Redis: Somma di PUNTEGGI in serie ordinata
risposta
L'unica opzione che penso sta iterando il set ordinato e calcolando il lato client somma.
Se i set sono piccoli e non è necessario eseguire prestazioni killer, desidero semplicemente eseguire l'iterazione (zrange/zrangebyscore) e sommare i valori lato client.
Se, al contrario, si parla di molte migliaia - milioni di elementi, è sempre possibile mantenere un set di riferimento con totali parziali per ciascun utente e incrementarlo/diminuirlo man mano che i regali vengono inviati.
Quindi, quando fate la vostra ZINCR 123:gifts 1 "3|345"
, si potrebbe fare un comando ZINCR separato, che potrebbe essere qualcosa di simile:
ZINCR received-gifts 1 <user_id>
Quindi, per ottenere il # dei doni ricevuti per un determinato utente, è sufficiente per eseguire uno Zscore:
ZSCORE received-gifts <user_id>
Il conteggio incrementale vince di gran lunga per i problemi online. La scansione deve essere utilizzata solo negli algoritmi offline, IMHO, poiché nessuno può prevedere la crescita futura del set di dati. Questa risposta dovrebbe essere quella accettata. Oh, e btw: si potrebbe scrivere un comando personalizzato che fa entrambi (aggiungendo a un set e incrementando il contatore, aggiornando un valore e regolando il contatore, eliminando dal set & ...) –
Disponibile dal Redis v2.6 è la capacità più impressionante di eseguire script Lua sul server Redis. Questo rende la sfida di riassumere i punteggi di un Ordinati Set per banale:
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 esempio:
~$ 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 è che il server Redis Gli script lua-side bloccano TUTTO, che può essere un dealbreaker nella maggior parte dei casi. Fonte: http://stackoverflow.com/a/30896608/2440 – Sire
Ecco un piccolo script lua che mantiene il punteggio zset totale, come si va, in un contatore con la chiave postfixed con ".ss". Puoi usarlo al posto di 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)
Questo script non dovrebbe costruire la chiave all'interno di lua ('KEYS [1] .. '.ss''), che" viola la semantica del comando EVAL come tutti i le chiavi utilizzate dallo script devono essere passate usando l'array KEYS "- https://redis.io/commands/eval – Jonathan
@Jonathan hai ragione, la chiave per il punteggio totale deve essere passata anche nelle CHIAVI [] – Patrick
- 1. Trova la somma di Fibonacci Serie
- 2. Calcolo somma della serie geometrica (mod m)
- 3. Trova la somma di una serie di sottoarray
- 4. Come calcolare somma dei quadrati delle serie di log
- 5. Come calcolare i punteggi?
- 6. Redis PFADD per verificare una query esistente nella serie
- 7. Somma di numeri che fanno una sequenza
- 8. Valutazione di più punteggi su sklearn cross_val_score
- 9. Come calcolare una somma parziale di una serie di valori in una query Linq?
- 10. Converti lista in tupla in serie numpy?
- 11. Cercapersone in Elasticsearch quando i risultati hanno punteggi uguali
- 12. Come puoi evitare che i punteggi fasulli più alti vengano visualizzati in un elenco di punteggi più alti?
- 13. Riproduzione ordinata di array casuali
- 14. righe Bind NSRuleEditor con serie
- 15. Node e Redis: Clienti Redis
- 16. La carta non ordinata è davvero non ordinata?
- 17. Campi di somma in sqlAlchemy
- 18. Somma di TimeSpan in C#
- 19. Salva Gioco Flash I punteggi PHP/MySQL
- 20. Matrice ordinata ma ruotata
- 21. tabella HTML ordinata
- 22. Determinazione della somma di due elementi in una somma di matrice preordinata uguale a un determinato valore
- 23. implementazione mappa ordinata
- 24. Fibonacci serie - sommatoria ricorsivo
- 25. Somma cumulativa condizionale in R
- 26. Bulk ingest in Redis
- 27. Interrogare in redis
- 28. Ottieni un intervallo di chiavi con redis?
- 29. Namespace in Redis?
- 30. typedef di serie di typedef di serie
grazie! Sì, immagino che questo sia probabilmente troppo specifico di una funzionalità per Redis che si preoccupa di implementare ... esp. dato che forse non sto facendo qualcosa di consigliabile. Sto utilizzando un set zset per memorizzare gli ID regalo ricevuti dall'utente e gli ID utente di invio e lo SCORE è il numero di volte in cui lo stesso regalo è stato ricevuto dallo stesso mittente. Ad esempio, 'ZINCR 123: regali 1" 3 | 345 "' invia l'ID regalo 3 dall'utente 345 all'utente 123. Quindi, voglio ottenere il totale dei regali che un utente ha ricevuto. Vedere? Forse c'è un modo migliore per implementarlo? È come l'API dei regali di Facebook. Regole di Redis! :) Grazie di tutto! – ma11hew28