2013-05-20 24 views
5

Hat jemand eine begrenzte Datenstruktur in Redis implementiert? Ich arbeite daran, etwas wie einen News-Feed zu erstellen. Der Feed wird sehr oft manipuliert und gelesen, und es wäre billig und perfekt für meinen Anwendungsfall, ihn in Redis in einem sortierten Set zu halten. Das einzige Problem ist, dass ich nur n Elemente pro Feed brauche, und ich mache mir Sorgen über einen Speicherüberlauf. Daher möchte ich sicherstellen, dass jeder Feed niemals über n Elemente kommt. Es scheint ziemlich trivial, eine verkappte sortierte Sammlung in Redis mit Lua zu machen:Redis Capped Sortiertes Set, Liste oder Warteschlange?

redis-cli EVAL "$(cat update_feed.lua)" 1 feeds:some_feed "thing_to_add", n 

Wo update_feed.lua so etwas wie (ohne vorher zu testen) aussieht:

redis.call('ZADD', KEYS[1], os.time(), ARGV[1]) 
local num = redis.call('ZCARD', KEYS[1]) 
if num > ARGV[2]: 
    redis.call('ZREMRANGEBYRANK', KEYS[1], -n, -inf) 

Das gar nicht so schlecht ist, und ziemlich billig, aber es scheint so ein einfaches Ding zu sein, das viel billiger machbar sein könnte, indem man das sortierte Set mit nur n Eimern anfängt. Ich kann keinen Weg finden, dies in redis zu tun, also denke ich, meine Frage ist: habe ich etwas vermisst, und wenn ich es nicht getan habe, warum gibt es dafür keine Struktur in redis, selbst wenn es nur den grundlegenden Lua lief Skript, das ich beschrieben habe, es scheint, es wäre ein typischer genug Anwendungsfall, dass es als eine Option für Redis-Datenstrukturen implementiert werden sollte?

+1

10 Das Hinzufügen des Elements und das Trimmen der Datenstruktur mithilfe von Lua-Skripten oder MULTI/EXEC-Blöcken ist das, was Sie tun sollen. Es gibt keine spezielle Option, dies automatisch zu tun. –

+0

@DidierSpezia können Sie das als Antwort hinzufügen, damit ich es akzeptieren kann? – Eli

+0

Sie sollten Gkamals Antwort akzeptieren, es sieht gut aus für mich. –

Antwort

15

Sie können LTRIM verwenden, wenn es sich um eine Liste handelt.

Auszug aus der Dokumentation.

LPUSH mylist someelement 
LTRIM mylist 0 99 

Dieses Paar von Befehlen wird ein neues Element auf der Liste drücken, gleichzeitig aber dafür sorgen, dass die Liste wächst nicht größer als 100 Elemente. Dies ist sehr nützlich, wenn Redis zum Beispiel zum Speichern von Protokollen verwendet wird. Es ist wichtig zu beachten, dass LTRIM, wenn es auf diese Weise verwendet wird, eine O (1) -Operation ist, weil im Durchschnitt nur ein Element vom Ende der Liste entfernt wird.

+0

Der gesamte Abschnitt ist aus der offiziellen Redis-Dokumentation extrahiert :-) – gkamal

1

Ich benutze dafür sortierte Sätze. Ich dachte auch über die Verwendung von Listen nach, aber dann fand ich, dass das Manipulieren der INSIDE einer Liste ziemlich teuer ist - O (n) - während das Manipulieren des Inneren einer sortierten Menge O (log n) ist.

Das ist, was den Deal für mich besiegelte - werden Sie jemals das Innere des Sets manipulieren? Wenn ja, bleiben Sie bei sortierten Sätzen und spülen Sie nur die ältesten, wann immer Sie müssen, genau wie Sie dachten.