Предполагам, че работите наопашка , където вмъквате 1000 елемента на едно място и ги извличате на няколко места в реда, в който са вмъкнати .
Не можете да го постигнете с една команда, но можете да го направите с 2 команди. Можете да напишете lua скрипт, за да ги направите атомарни.
Lrange :http://redis.io/commands/lrange
Lrange list -100 -1
Това ще ви изброи първите 100 елемента в списъка. тук отместването е -100. Имайте предвид, че това ще върне елементите в обратния ред, в който са вмъкнати. Така че трябва да обърнете цикъла, за да осигурите механизма на опашката.
Ltrim :http://redis.io/commands/ltrim
ltrim list 0 -101
Това ще отреже първите 100 елемента в списъка. тук 101 е n+1, така че трябва да е 101. Тук изместването е 101
Записването им в блок lua ще ви гарантира атомарността.
Нека ви дам прост пример.
Вмъквате 100 елемента на едно място.
lpush list 1 2 3 .. 100
Имате множество клиенти, които се опитват да осъществят достъп до този lua блок. Да кажем, че стойността ви n е 5 тук. 1-ви клиент влиза и получава вмъкнати първите 5 елемента.
127.0.0.1:6379> lrange list -5 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
Запазвате ги във вашия lua обект и ги изтривате.
127.0.0.1:6379> LTRIM list 0 -6
OK
върнете ги във вашия код, сега резултатът, който искате, е 1 2 3 4 5, но това, което имате, е 5 4 3 2 1. Така че трябва да обърнете цикъла и да изпълните операцията.
Когато влезе следващият клиент, той ще получи следващия набор от стойности.
127.0.0.1:6379> lrange list -5 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
По този начин можете да постигнете вашето изискване. Надявам се това да помогне.
РЕДАКТИРАНЕ:
Lua скрипт:
local result = redis.call('lrange', 'list','-5','-1')
redis.call('ltrim','list','0','-6')
return result