sql >> Databasteknik >  >> NoSQL >> Redis

Redis Pop listobjekt Efter antal objekt

Jag antar att du arbetar på en , där du infogar 1000 artiklar på en enda plats och hämtar dem på flera ställen i den ordning som de infogades .

Du kan inte uppnå det med ett enda kommando men du kan göra det med 2 kommandon. Du kan skriva ett lua-script för att göra dem atomära.

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

Lrange list -100 -1

Detta kommer att lista de första 100 elementen i listan. här är offset -100. Notera att detta kommer att returnera föremålen i motsatt ordning som den sätts in. Så du måste vända slingan för att säkerställa kömekanismen.

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

ltrim list 0 -101

Detta kommer att trimma de första 100 elementen i listan. här är 101 n+1 så det måste vara 101. Här är offset 101

Att skriva dem i ett lua-block kommer att säkerställa atomiciteten.

Låt mig ge dig ett enkelt exempel.

Du infogar 100 element på en enda plats.

lpush list 1 2 3 .. 100

Du har flera klienter som försöker komma åt detta lua-block. Säg att ditt n-värde är 5 här. 1stclient kommer in och får de första 5 elementen infogade.

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

Du behåller dem i ditt lua-objekt och raderar dem.

127.0.0.1:6379> LTRIM list 0 -6
OK

returnera dem till din kod, nu är resultatet du vill ha 1 2 3 4 5 men vad du har är 5 4 3 2 1. Så du måste vända loopen och utföra operationen.

När nästa klient kommer in kommer den att få nästa uppsättning värden.

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

På så sätt kan du uppnå dina krav. Hoppas det här hjälper.

EDIT:

Lua script:

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


  1. Ändra MongoDB datalagringskatalog

  2. Skapa nya Meteor-samlingar i farten

  3. Laravel Echo Server, Redis, Socket.IO:Kan inte få dem att fungera

  4. Agentlös databasövervakning med ClusterControl