Jag antar att du arbetar på en kö , där du infogar 1000 artiklar på en enda plats och hämtar dem på flera ställen i den ordning som de infogades .
Du kan inte uppnå det med ett enda kommando men du kan göra det med 2 kommandon. Du kan skriva ett lua-script för att göra dem atomära.
Lrange:http://redis.io/commands/lrange
Lrange list -100 -1
Detta kommer att lista de första 100 elementen i listan. här är offset -100. Notera att detta kommer att returnera föremålen i motsatt ordning som den sätts in. Så du måste vända slingan för att säkerställa kömekanismen.
Ltrim:http://redis.io/commands/ltrim
ltrim list 0 -101
Detta kommer att trimma de första 100 elementen i listan. här är 101 n+1 så det måste vara 101. Här är offset 101
Att skriva dem i ett lua-block kommer att säkerställa atomiciteten.
Låt mig ge dig ett enkelt exempel.
Du infogar 100 element på en enda plats.
lpush list 1 2 3 .. 100
Du har flera klienter som försöker komma åt detta lua-block. Säg att ditt n-värde är 5 här. 1stclient kommer in och får de första 5 elementen infogade.
127.0.0.1:6379> lrange list -5 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
Du behåller dem i ditt lua-objekt och raderar dem.
127.0.0.1:6379> LTRIM list 0 -6
OK
returnera dem till din kod, nu är resultatet du vill ha 1 2 3 4 5 men vad du har är 5 4 3 2 1. Så du måste vända loopen och utföra operationen.
När nästa klient kommer in kommer den att få nästa uppsättning värden.
127.0.0.1:6379> lrange list -5 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
På så sätt kan du uppnå dina krav. Hoppas det här hjälper.
EDIT:
Lua script:
local result = redis.call('lrange', 'list','-5','-1')
redis.call('ltrim','list','0','-6')
return result