Ik neem aan dat je werkt aan een wachtrij , waarbij u 1000 items op één plaats invoegt en ze op meerdere plaatsen terughaalt in de volgorde waarin ze zijn ingevoegd .
Je kunt het niet met één commando bereiken, maar je kunt het met 2 commando's doen. Je kunt een lua-script schrijven om ze atomair te maken.
Lrange:http://redis.io/commands/lrange
Lrange list -100 -1
Hiermee worden de eerste 100 elementen in de lijst weergegeven. hier is de offset -100. Merk op dat hierdoor de items worden geretourneerd in de tegenovergestelde volgorde waarin deze is ingevoegd. Dus je moet de lus omkeren om het wachtrijmechanisme te garanderen.
Ltrim:http://redis.io/commands/ltrim
ltrim list 0 -101
Hiermee worden de eerste 100 elementen in de lijst bijgesneden. hier is 101 n+1 dus het moet 101 zijn. Hier is offset 101
Als je ze in een lua-blok schrijft, weet je zeker dat je de atomiciteit hebt.
Laat me je een eenvoudig voorbeeld geven.
U voegt 100 elementen op één plaats in.
lpush list 1 2 3 .. 100
Je hebt meerdere clients die elk toegang proberen te krijgen tot dit lua-blok. Stel dat uw n-waarde hier 5 is. 1stclient komt binnen en krijgt de eerste 5 elementen ingevoegd.
127.0.0.1:6379> lrange list -5 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
Je bewaart ze in je lua-object en verwijdert ze.
127.0.0.1:6379> LTRIM list 0 -6
OK
breng ze terug naar je code, nu is het resultaat dat je wilt 1 2 3 4 5 maar wat je hebt is 5 4 3 2 1. Dus je moet de lus omkeren en de bewerking uitvoeren.
Wanneer de volgende klant binnenkomt, krijgt deze de volgende reeks waarden.
127.0.0.1:6379> lrange list -5 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
Op deze manier kunt u uw behoefte realiseren. Ik hoop dat dit helpt.
BEWERKEN:
Lua-script:
local result = redis.call('lrange', 'list','-5','-1')
redis.call('ltrim','list','0','-6')
return result