Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Redis Element listy pop Według liczby elementów

Zakładam, że pracujesz w kolejce , gdzie wstawiasz 1000 elementów w jednym miejscu i pobierasz je w wielu miejscach w kolejności, w jakiej są wstawiane .

Nie możesz tego osiągnąć jednym poleceniem, ale możesz to zrobić za pomocą 2 poleceń. Możesz napisać skrypt lua, aby uczynić je atomowymi.

Lrange :http://redis.io/commands/lrange

Lrange list -100 -1

Spowoduje to wyświetlenie pierwszych 100 elementów na liście. tutaj przesunięcie wynosi -100. Zauważ, że zwróci to elementy w odwrotnej kolejności, w jakiej zostały wstawione. Musisz więc odwrócić pętlę, aby zapewnić mechanizm kolejki.

Ltrim:http://redis.io/commands/ltrim

ltrim list 0 -101

Spowoduje to przycięcie pierwszych 100 elementów na liście. tutaj 101 to n+1, więc musi być 101. Tutaj przesunięcie wynosi 101

Zapisanie ich w bloku lua zapewni ci atomowość.

Podam prosty przykład.

Wstawiasz 100 elementów w jednym miejscu.

lpush list 1 2 3 .. 100

Masz wielu klientów, z których każdy próbuje uzyskać dostęp do tego bloku lua. Powiedzmy, że twoja wartość n wynosi tutaj 5. Pierwszy klient wchodzi i wstawia pierwsze 5 elementów.

127.0.0.1:6379> lrange list -5 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"

Przechowujesz je w swoim obiekcie lua i usuwasz.

127.0.0.1:6379> LTRIM list 0 -6
OK

zwróć je do swojego kodu, teraz żądany wynik to 1 2 3 4 5, ale masz 5 4 3 2 1. Musisz więc odwrócić pętlę i wykonać operację.

Gdy pojawi się następny klient, otrzyma następny zestaw wartości.

127.0.0.1:6379> lrange list -5 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"

W ten sposób możesz spełnić swoje wymagania. Mam nadzieję że to pomoże.

EDYTUJ:

Skrypt Lua:

local result = redis.call('lrange', 'list','-5','-1')
redis.call('ltrim','list','0','-6')
return result


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Prototyp obiektu Node.JS może być tylko Object lub null z Redis

  2. Pracujesz z dwoma oddzielnymi instancjami redis z sidekiq?

  3. Czy kabel Action 5 wymaga Redisa?

  4. Sortowanie dynamiczne z Redis

  5. Jak stworzyć model we wzorcu DRY za pomocą flow.js (dla wywołań asynchronicznych) w node.js?