2013-05-20 22 views
5

Czy ktoś zaimplementował ograniczoną strukturę danych w Redis? Pracuję nad budowaniem czegoś w rodzaju kanału informacyjnego. Kanał zostanie zmanipulowany i odczytywany z bardzo często, a trzymanie go w posortowanym zestawie w Redis będzie tanie i idealne dla mojego przypadku użycia. Jedynym problemem jest to, że potrzebuję tylko n elementów na kanał i martwię się przepełnieniem pamięci, dlatego chciałbym, aby każdy z nich nigdy nie przekroczył n pozycji. Wydaje się całkiem trywialne dokonać kaucyjna kolekcji posortowane w Redis z Lua:Redis Capped Sorted Set, List lub Queue?

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

Gdzie update_feed.lua wygląda mniej więcej tak (bez testowania IT):

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) 

To nie jest źle, i dość tanie, ale wydaje się, że jest to tak podstawowa rzecz, która może być znacznie tańsza dzięki utworzeniu posortowanego zestawu za pomocą tylko n wiaderek. Nie mogę znaleźć sposobu, aby to zrobić na czerwono, więc domyślam się, że moje pytanie brzmi: czy coś przeoczyłem, a jeśli nie, dlaczego nie ma na to struktury redis, nawet jeśli to po prostu działa podstawowa lua opisałem skrypt, wydaje się, że byłby to typowy przypadek użycia, który powinien być zaimplementowany jako opcja dla struktur danych redis?

+1

Dodanie elementu i przycięcie struktury danych za pomocą skryptów Lua lub bloków MULTI/EXEC jest tym co powinieneś zrobić. Nie ma konkretnej opcji, aby zrobić to automatycznie. –

+0

@DidierSpezia możesz dodać to jako odpowiedź, więc mogę to zaakceptować? – Eli

+0

Powinieneś zaakceptować odpowiedź Gkamala, która dla mnie wygląda dobrze. –

Odpowiedz

15

Możesz użyć LTRIM, jeśli jest to lista.

Fragment dokumentacji.

LPUSH mylist someelement 
LTRIM mylist 0 99 

Ta para poleceń spowoduje naciśnięcie nowego elementu na liście, jednocześnie upewniając się, że lista nie urosła powyżej 100 elementów. Jest to bardzo przydatne, gdy na przykład do zapisywania logów używa się Redis. Ważne jest, aby pamiętać, że gdy jest używany w ten sposób, LTRIM jest operacją O (1), ponieważ w przypadku przeciętnym tylko jeden element jest usuwany z końca listy.

+0

Cała sekcja pochodzi z oficjalnej dokumentacji redisu :-) – gkamal

1

Ja sam używam do tego posortowanych zestawów. Myślałem także o używaniu list, ale potem odkryłem, że manipulowanie WEWNĄTRZ listy jest dość kosztowne - O (n) - podczas gdy manipulowanie wewnątrz sortowanego zestawu to O (log n).

To właśnie zamknęło umowę dla mnie - czy kiedykolwiek będziesz manipulował wnętrzem zestawu? Jeśli tak, trzymaj się sortowanych zestawów i po prostu spłukuj najstarsze, kiedy będziesz musiał, tak jak myślałeś.