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