Ano, tříděné sady jsou velmi rychlé a výkonné. Zdá se, že mnohem lépe odpovídají vašim požadavkům než SORT
operace. Časová složitost je často nepochopena. O(log(N)) je velmi rychlý a měří se v pohodě. Používáme to pro desítky milionů členů v jedné tříděné sadě. Načítání a vkládání je pod milisekundou.
Použijte ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count]
abyste získali své výsledky.
V závislosti na tom, jak ukládáte časová razítka jako „skóre“, může být ZREVRANGEBYSCORE lepší.
Malá poznámka k časovým razítkům:Seřazená sada SCORES
které nepotřebují desetinnou část, by měly používat 15 číslic nebo méně. Takže SCORE
musí zůstat v rozsahu -999999999999999 až 999999999999999. Poznámka:Tyto limity existují, protože server Redis ve skutečnosti interně ukládá skóre (float) jako reprezentaci redis-řetězce.
Proto doporučuji tento formát převedený na Zulu Time:-20140313122802 pro druhou přesnost. Můžete přidat 1 číslici pro přesnost 100 ms, ale ne více pokud nechcete žádnou ztrátu přesnosti. Mimochodem, stále je to float64, takže ztráta přesnosti může být v některých scénářích v pořádku, ale váš případ se hodí do rozsahu „dokonalé přesnosti“, takže to doporučuji.
Pokud platnost vašich dat vyprší do 10 let, můžete také přeskočit první tři číslice (CCY z CCYY), abyste dosáhli přesnosti 0,0001 sekundy.
Zde navrhuji záporné skóre, takže můžete použít jednodušší ZRANGEBYSCORE
místo REV
jeden. Můžete použít -inf
jako počáteční skóre (minus nekonečno) a LIMIT 0 100
získat 100 nejlepších výsledků.
Dva seřazení members
(nebo 'keys'
ale to je nejednoznačné, protože setříděná sada je také sama o sobě klíčem) může sdílet score
, to není problém, výsledky v rámci identického score
jsou abecední.
Doufám, že to pomůže, TW
Upravit po chatu
OP chtěl shromáždit data (pomocí ZSET
) z různých klíčů (GET
/SET
nebo HGET
/HSET
klíče). JOIN
může to udělat za vás, ZRANGEBYSCORE
can't. Preferovaným způsobem, jak toho dosáhnout, je jednoduchý skript Lua. Skript Lua se spustí na serveru. V níže uvedeném příkladu používám EVAL
pro jednoduchost byste ve výrobě použili SCRIPT EXISTS
, SCRIPT LOAD
a EVALSHA
. Většina klientských knihoven má nějakou vestavěnou účetní logiku, takže skript nenahráváte pokaždé.
Zde je 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
Použijete jej takto (neupravený příklad, nekódovaný pro výkon) :
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
Výsledek:
1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"