sql >> Database >  >> NoSQL >> Redis

Redis:nieuwsfeeds in lijst of gesorteerde set uitwaaieren?

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"



  1. Welke parameters worden doorgegeven aan Mongoose-callbacks

  2. Hoe een bulkupdate van documenten in MongoDB met Java uitvoeren?

  3. StackExchange.Redis ConnectionMultiplexer-pool voor synchrone methoden

  4. Krijg alle sleutels in de Redis-database met python