Tak, posortowane zestawy są bardzo szybkie i wydajne. Wydają się znacznie lepiej pasować do Twoich wymagań niż SORT
operacje. Złożoność czasowa jest często źle rozumiana. O(log(N)) jest bardzo szybki i dobrze się skaluje. Używamy go dla dziesiątek milionów członków w jednym posortowanym zestawie. Pobieranie i wstawianie trwa poniżej milisekundy.
Użyj ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count]
aby uzyskać swoje wyniki.
W zależności od tego, jak przechowujesz znaczniki czasu jako „wyniki”, ZREVRANGEBYSCORE może być lepszy.
Mała uwaga na temat znaczników czasu:Posortowany zestaw SCORES
które nie wymagają części dziesiętnej, powinny zawierać 15 cyfr lub mniej. Tak więc SCORE
musi pozostać w zakresie od -999999999999999 do 999999999999999. Uwaga:Te limity istnieją, ponieważ serwer Redis faktycznie przechowuje wynik (zmiennoprzecinkowy) jako reprezentację redis-string wewnętrznie.
Dlatego polecam ten format, przekonwertowany na czas Zulu:-20140313122802 dla drugiej precyzji. Możesz dodać 1 cyfrę dla precyzji 100 ms, ale nie więcej, jeśli nie chcesz tracić precyzji. Nawiasem mówiąc, wciąż jest to float64, więc utrata precyzji może być w niektórych sytuacjach w porządku, ale twój przypadek mieści się w zakresie „doskonałej precyzji”, więc to właśnie polecam.
Jeśli Twoje dane wygasną w ciągu 10 lat, możesz również pominąć trzy pierwsze cyfry (CCY lub CCYY), aby osiągnąć dokładność 0,0001 sekundy.
Sugeruję tutaj negatywne wyniki, więc możesz użyć prostszego ZRANGEBYSCORE
zamiast REV
jeden. Możesz użyć -inf
jako wynik startowy (minus nieskończoność) i LIMIT 0 100
aby uzyskać 100 najlepszych wyników.
Dwa posortowane zestawy members
(lub 'keys'
ale to niejednoznaczne, ponieważ posortowany zestaw jest również kluczem samym w sobie) może udostępnić score
, to żaden problem, wyniki w identycznym score
są alfabetyczne.
Mam nadzieję, że to pomoże, TW
Edytuj po czacie
OP chciał zbierać dane (za pomocą ZSET
) z różnych kluczy (GET
/SET
lub HGET
/HSET
Klucze). JOIN
może zrobić to za Ciebie, ZRANGEBYSCORE
nie mogę. Preferowanym sposobem na zrobienie tego jest prosty skrypt Lua. Skrypt Lua jest wykonywany na serwerze. W poniższym przykładzie używam EVAL
dla uproszczenia, w środowisku produkcyjnym użyjesz SCRIPT EXISTS
, SCRIPT LOAD
i EVALSHA
. Większość bibliotek klienckich ma wbudowaną logikę księgową, więc nie należy przesyłać skryptu za każdym razem.
Oto example.lua
:
local r={}
local zkey=KEYS[1]
local a=redis.call('zrangebyscore', zkey, KEYS[2], KEYS[3], 'withscores', 'limit', 0, KEYS[4])
for i=1,#a,2 do
r[i]=a[i+1]
r[i+1]=redis.call('get', a[i])
end
return r
Używasz go w ten sposób (surowy przykład, niekodowany pod kątem wydajności) :
redis-cli -p 14322 set activity:1 act1JSON
redis-cli -p 14322 set activity:2 act2JSON
redis-cli -p 14322 zadd feed 1 activity:1
redis-cli -p 14322 zadd feed 2 activity:2
redis-cli -p 14322 eval '$(cat example.lua)' 4 feed '-inf' '+inf' 100
Wynik:
1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"