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