Ja, gesorteerde sets zijn erg snel en krachtig. Ze lijken veel beter aan uw eisen te voldoen dan SORT
activiteiten. De complexiteit van de tijd wordt vaak verkeerd begrepen. O(log(N)) is erg snel en schaalt prima. We gebruiken het voor tientallen miljoenen leden in één gesorteerde set. Ophalen en invoegen is minder dan een milliseconde.
Gebruik ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count]
om uw resultaten te krijgen.
Afhankelijk van hoe je de tijdstempels opslaat als 'scores', is ZREVRANGEBYSCORE misschien beter.
Een kleine opmerking over de tijdstempels:Gesorteerde set SCORES
die geen decimaal deel nodig hebben, moeten 15 cijfers of minder gebruiken. Dus de SCORE
moet binnen het bereik van -999999999999999 tot 999999999999999 blijven. Opmerking:deze limieten bestaan omdat de Redis-server de score (float) intern opslaat als een redis-string-representatie.
Ik raad daarom dit formaat aan, geconverteerd naar Zulu Time:-20140313122802 voor tweede precisie. U mag 1 cijfer toevoegen voor een precisie van 100 ms, maar niet meer als u wilt geen verlies aan precisie. Het is trouwens nog steeds een float64, dus verlies van precisie kan in sommige scenario's prima zijn, maar je case past in het bereik van 'perfecte precisie', dus dat raad ik aan.
Als uw gegevens binnen 10 jaar verlopen, kunt u ook de eerste drie cijfers (CCY of CCYY) overslaan om een nauwkeurigheid van 0,0001 seconde te bereiken.
Ik stel hier negatieve scores voor, zodat u de eenvoudigere ZRANGEBYSCORE
. kunt gebruiken in plaats van de REV
een. U kunt -inf
. gebruiken als de startscore (min oneindig) en LIMIT 0 100
om de top 100 resultaten te krijgen.
Twee gesorteerde set members
(of 'keys'
maar dat is dubbelzinnig aangezien de gesorteerde set ook een sleutel op zich is) mag een score
delen , dat is geen probleem, de resultaten binnen een identieke score
zijn alfabetisch.
Ik hoop dat dit helpt, TW
Bewerken na chat
De OP wilde gegevens verzamelen (met behulp van een ZSET
) van verschillende sleutels (GET
/SET
of HGET
/HSET
sleutels). JOIN
kan dat voor je doen, ZRANGEBYSCORE
kan niet.De beste manier om dit te doen, is een eenvoudig Lua-script. Het Lua-script wordt uitgevoerd op de server. In het onderstaande voorbeeld gebruik ik EVAL
voor de eenvoud zou je in productie SCRIPT EXISTS
. gebruiken , SCRIPT LOAD
en EVALSHA
. De meeste clientbibliotheken hebben een ingebouwde boekhoudlogica, dus u hoeft het script niet elke keer te uploaden.
Hier is een 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
Je gebruikt het als volgt (rauw voorbeeld, niet gecodeerd voor prestaties) :
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
Resultaat:
1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"