Redis
 sql >> Base de données >  >> NoSQL >> Redis

Élément de liste Redis Pop Par nombre d'éléments

Je suppose que vous travaillez sur une file d'attente , où vous insérez 1000 éléments à un seul endroit et les récupérez à plusieurs endroits dans l'ordre dans lequel ils sont insérés .

Vous ne pouvez pas y parvenir avec une seule commande, mais vous pouvez le faire avec 2 commandes. Vous pouvez écrire un script Lua pour les rendre atomiques.

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

Lrange list -100 -1

Cela vous listera les 100 premiers éléments de la liste. ici, le décalage est de -100. Notez que cela renverra les éléments dans l'ordre inverse dans lequel il est inséré. Il faut donc inverser la boucle pour assurer le mécanisme de file d'attente.

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

ltrim list 0 -101

Cela supprimera les 100 premiers éléments de la liste. ici 101 est n+1 donc ça doit être 101. Ici le décalage est 101

Les écrire dans un bloc lua vous assurera l'atomicité.

Laissez-moi vous donner un exemple simple.

Vous insérez 100 éléments en un seul endroit.

lpush list 1 2 3 .. 100

Vous avez plusieurs clients essayant chacun d'accéder à ce bloc Lua. Disons que votre valeur n est 5 ici. Le 1er client entre et obtient les 5 premiers éléments insérés.

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

Vous les conservez dans votre objet lua et les supprimez.

127.0.0.1:6379> LTRIM list 0 -6
OK

renvoyez-les à votre code, maintenant le résultat que vous voulez est 1 2 3 4 5 mais ce que vous avez est 5 4 3 2 1. Vous devez donc inverser la boucle et effectuer l'opération.

Lorsque le prochain client entrera, il obtiendra le prochain ensemble de valeurs.

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

De cette façon, vous pouvez atteindre votre exigence. J'espère que cela t'aides.

MODIF :

Script Lua :

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