Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis:Newsfeeds in Liste oder sortierter Menge auffächern?

Ja, sortierte Sätze sind sehr schnell und leistungsfähig. Sie scheinen Ihren Anforderungen viel besser zu entsprechen als SORT Operationen. Die Zeitkomplexität wird oft missverstanden. O(log(N)) ist sehr schnell und lässt sich gut skalieren. Wir verwenden es für zig Millionen Mitglieder in einem sortierten Satz. Das Abrufen und Einfügen dauert weniger als eine Millisekunde.

Verwenden Sie ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count] um Ihre Ergebnisse zu erhalten.

Je nachdem, wie Sie die Zeitstempel als "Ergebnisse" speichern, ist ZREVRANGEBYSCORE möglicherweise besser.

Eine kleine Anmerkung zu den Zeitstempeln:Sorted set SCORES die keinen Dezimalteil benötigen, sollten 15 Stellen oder weniger verwenden. Also der SCORE muss im Bereich von -999999999999999 bis 999999999999999 bleiben. Hinweis:Diese Grenzwerte existieren, weil der Redis-Server die Punktzahl (Float) tatsächlich intern als Redis-String-Darstellung speichert.

Ich empfehle daher dieses Format, konvertiert in Zulu-Zeit:-20140313122802 für die Sekundengenauigkeit. Sie können 1 Ziffer für eine Genauigkeit von 100 ms hinzufügen, aber kein if mehr Sie möchten keinen Präzisionsverlust. Es ist übrigens immer noch ein Float64, daher könnte ein Präzisionsverlust in einigen Szenarien in Ordnung sein, aber Ihr Fall passt in den Bereich der „perfekten Präzision“, also empfehle ich das.

Wenn Ihre Daten innerhalb von 10 Jahren ablaufen, können Sie auch die ersten drei Ziffern (CCY von CCYY) überspringen, um eine Genauigkeit von 0,0001 Sekunden zu erreichen.

Ich schlage hier negative Punktzahlen vor, damit Sie den einfacheren ZRANGEBYSCORE verwenden können statt REV ein. Sie können -inf verwenden als Startpunktzahl (minus unendlich) und LIMIT 0 100 um die Top-100-Ergebnisse zu erhalten.

Zwei sortierte Mengen members (oder 'keys' aber das ist mehrdeutig, da die sortierte Menge selbst auch ein Schlüssel ist) können sich eine score teilen , das ist kein Problem, die Ergebnisse innerhalb eines identischen score sind alphabetisch.

Hoffe das hilft, TW

Nach dem Chat bearbeiten

Das OP wollte Daten sammeln (mit einem ZSET ) aus verschiedenen Schlüsseln (GET /SET oder HGET /HSET Schlüssel). JOIN kann das für Sie erledigen, ZRANGEBYSCORE kann nicht. Der bevorzugte Weg, dies zu tun, ist ein einfaches Lua-Skript. Das Lua-Skript wird auf dem Server ausgeführt. Im Beispiel unten verwende ich EVAL Der Einfachheit halber würden Sie in der Produktion SCRIPT EXISTS verwenden , SCRIPT LOAD und EVALSHA . Die meisten Clientbibliotheken verfügen über eine integrierte Buchhaltungslogik, sodass Sie das Skript nicht jedes Mal hochladen müssen.

Hier ist eine 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

Sie verwenden es so (rohes Beispiel, nicht für Leistung codiert) :

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

Ergebnis:

1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"