Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Item da lista Redis Pop Por número de itens


Presumo que você esteja trabalhando em uma fila , onde você insere 1.000 itens em um único local e os recupera em vários locais na ordem em que são inseridos .

Você não pode alcançá-lo com um único comando, mas pode fazê-lo com 2 comandos. Você pode escrever um script lua para torná-los atômicos.

Lrange:http://redis.io/commands/lrange
Lrange list -100 -1

Isso listará os primeiros 100 elementos da lista. aqui o deslocamento é -100. Observe que isso retornará os itens na ordem oposta em que foi inserido. Então você precisa reverter o loop para garantir o mecanismo de fila.

Ltrim:http://redis.io/commands/ltrim
ltrim list 0 -101

Isso cortará os primeiros 100 elementos da lista. aqui 101 é n+1 então deve ser 101. Aqui o deslocamento é 101

Escrevê-los dentro de um bloco lua garantirá a atomicidade.

Deixe-me dar um exemplo simples.

Você insere 100 elementos em um único lugar.
lpush list 1 2 3 .. 100

Você tem vários clientseach tentando acessar este bloco lua. Digamos que seu valor n seja 5 aqui. 1stclient entra e obtém os primeiros 5 elementos inseridos.
127.0.0.1:6379> lrange list -5 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"

Você os mantém em seu objeto lua e os exclui.
127.0.0.1:6379> LTRIM list 0 -6
OK

retorne-os ao seu código, agora o resultado que você quer é 1 2 3 4 5 mas o que você tem é 5 4 3 2 1. Então você precisa reverter o loop e realizar a operação.

Quando o próximo cliente chegar, ele receberá o próximo conjunto de valores.
127.0.0.1:6379> lrange list -5 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"

Desta forma, você pode atingir sua exigência. Espero que isto ajude.

EDITAR:

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