sql >> Database teknologi >  >> NoSQL >> Redis

Redis Pop listeelement Efter antal elementer

Jeg går ud fra, at du arbejder på en , hvor du indsætter 1000 elementer på et enkelt sted og henter dem flere steder i den rækkefølge, de er indsat i .

Du kan ikke opnå det med en enkelt kommando, men du kan gøre det med 2 kommandoer. Du kan skrive et lua-script for at gøre dem atomare.

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

Lrange list -100 -1

Dette vil vise dig de første 100 elementer på listen. her er forskydningen -100. Bemærk, at dette vil returnere varerne i den modsatte rækkefølge, som det er indsat. Så du skal vende sløjfen for at sikre kømekanismen.

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

ltrim list 0 -101

Dette vil trimme de 1. 100 elementer på listen. her er 101 n+1, så det skal være 101. Her er offset 101

At skrive dem inde i en lua-blok vil sikre dig atomiciteten.

Lad mig give dig et simpelt eksempel.

Du indsætter 100 elementer på et enkelt sted.

lpush list 1 2 3 .. 100

Du har flere klienter, der forsøger at få adgang til denne lua-blok. Sig, at din n-værdi er 5 her. 1stclient kommer ind og får de første 5 elementer indsat.

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

Du beholder dem i dit lua-objekt og sletter dem.

127.0.0.1:6379> LTRIM list 0 -6
OK

returner dem til din kode, nu er det ønskede resultat 1 2 3 4 5, men det du har er 5 4 3 2 1. Så du skal vende sløjfen og udføre operationen.

Når den næste klient kommer ind, vil den få det næste sæt værdier.

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

På denne måde kan du nå dit krav. Håber dette hjælper.

EDIT:

Lua script:

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


  1. Brug af kort/reducer til kortlægning af egenskaberne i en samling

  2. Bestiller MongoDB's $in-klausul garantiordre

  3. MongoDB $count Aggregation Operator

  4. mongodb får tydelige rekorder