sql >> Base de Datos >  >> NoSQL >> Redis

Elemento de la lista Pop de Redis Por número de elementos

Supongo que está trabajando en una cola , donde inserta 1000 elementos en un solo lugar y los recupera en varios lugares en el orden en que se insertan .

No puedes lograrlo con un solo comando, pero puedes hacerlo con 2 comandos. Puede escribir un script lua para hacerlos atómicos.

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

Lrange list -100 -1

Esto le mostrará una lista de los primeros 100 elementos de la lista. aquí el desplazamiento es -100. Tenga en cuenta que esto devolverá los elementos en el orden opuesto al que se insertó. Por lo tanto, debe invertir el ciclo para garantizar el mecanismo de la cola.

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

ltrim list 0 -101

Esto recortará los primeros 100 elementos de la lista. aquí 101 es n+1 por lo que debe ser 101. Aquí el desplazamiento es 101

Escribirlos dentro de un bloque lua te asegurará la atomicidad.

Déjame darte un ejemplo simple.

Insertas 100 elementos en un solo lugar.

lpush list 1 2 3 .. 100

Tiene varios clientes tratando de acceder a este bloque lua. Digamos que su valor n es 5 aquí. El primer cliente ingresa y obtiene los primeros 5 elementos insertados.

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

Los guardas en tu objeto lua y los eliminas.

127.0.0.1:6379> LTRIM list 0 -6
OK

devuélvalos a su código, ahora el resultado que desea es 1 2 3 4 5 pero lo que obtuvo es 5 4 3 2 1. Por lo tanto, debe invertir el ciclo y realizar la operación.

Cuando entre el siguiente cliente, obtendrá el siguiente conjunto de valores.

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

De esta manera usted puede lograr su requerimiento. Espero que esto ayude.

EDITAR:

Guión Lua:

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