Předpokládám, že pracujete ve frontě , kde vložíte 1000 položek na jedno místo a načtete je na více místech v pořadí, ve kterém jsou vloženy .
Nemůžete toho dosáhnout jediným příkazem, ale můžete to udělat pomocí 2 příkazů. Můžete napsat lua skript, aby byly atomické.
Lrange:http://redis.io/commands/lrange
Lrange list -100 -1
Tím se zobrazí seznam prvních 100 prvků v seznamu. zde je offset -100. Všimněte si, že to vrátí položky v opačném pořadí, v jakém byly vloženy. Takže musíte obrátit smyčku, abyste zajistili mechanismus fronty.
Ltrim:http://redis.io/commands/ltrim
ltrim list 0 -101
Tím se ořízne 1. 100 prvků v seznamu. zde 101 je n+1, takže musí být 101. Zde offset je 101
Jejich zápis do lua bloku vám zajistí atomicitu.
Dovolte mi uvést jednoduchý příklad.
Vložíte 100 prvků na jedno místo.
lpush list 1 2 3 .. 100
Máte několik klientů, z nichž každý se pokouší o přístup k tomuto bloku lua. Řekněme, že vaše hodnota n je zde 5. První klient vstoupí a vloží prvních 5 prvků.
127.0.0.1:6379> lrange list -5 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
Ponecháte si je ve svém objektu lua a odstraníte je.
127.0.0.1:6379> LTRIM list 0 -6
OK
vraťte je do svého kódu, nyní požadovaný výsledek je 1 2 3 4 5, ale máte 5 4 3 2 1. Takže musíte obrátit cyklus a provést operaci.
Když přijde další klient, dostane další sadu hodnot.
127.0.0.1:6379> lrange list -5 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
Tímto způsobem můžete dosáhnout svého požadavku. Snad to pomůže.
UPRAVIT:
Skript Lua:
local result = redis.call('lrange', 'list','-5','-1')
redis.call('ltrim','list','0','-6')
return result