Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis Pop-Listenelement Nach Anzahl der Elemente

Ich gehe davon aus, dass Sie an einer Warteschlange arbeiten , wo Sie 1000 Elemente an einer einzelnen Stelle einfügen und sie an mehreren Stellen abrufen in der Reihenfolge, in der sie eingefügt wurden .

Sie können es nicht mit einem einzigen Befehl erreichen, aber Sie können es mit 2 Befehlen tun. Sie können ein Lua-Skript schreiben, um sie atomar zu machen.

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

Lrange list -100 -1

Dadurch werden die ersten 100 Elemente in der Liste aufgelistet. hier ist der Offset -100. Beachten Sie, dass dadurch die Elemente in der umgekehrten Reihenfolge zurückgegeben werden, in der sie eingefügt wurden. Sie müssen also die Schleife umkehren, um den Warteschlangenmechanismus sicherzustellen.

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

ltrim list 0 -101

Dadurch werden die ersten 100 Elemente in der Liste getrimmt. hier ist 101 n+1, also muss es 101 sein. Hier ist offset 101

Wenn Sie sie in einen Lua-Block schreiben, stellen Sie die Atomarität sicher.

Lassen Sie mich Ihnen ein einfaches Beispiel geben.

Sie fügen 100 Elemente an einer einzigen Stelle ein.

lpush list 1 2 3 .. 100

Sie haben mehrere Clients, von denen jeder versucht, auf diesen Lua-Block zuzugreifen. Angenommen, Ihr n-Wert ist hier 5. Der erste Kunde kommt rein und bekommt die ersten 5 Elemente eingefügt.

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

Sie behalten sie in Ihrem Lua-Objekt und löschen sie.

127.0.0.1:6379> LTRIM list 0 -6
OK

Geben Sie sie in Ihren Code zurück, jetzt ist das gewünschte Ergebnis 1 2 3 4 5, aber Sie haben 5 4 3 2 1. Sie müssen also die Schleife umkehren und die Operation ausführen.

Wenn der nächste Client hereinkommt, erhält er den nächsten Satz von Werten.

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

Auf diese Weise können Sie Ihre Anforderung erfüllen. Hoffe das hilft.

BEARBEITEN:

Lua-Skript:

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