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

Voce dell'elenco pop Redis Per numero di voci

Presumo che tu stia lavorando su una coda , dove inserisci 1000 articoli in un unico posto e li recuperi in più punti nell'ordine in cui è stato inserito .

Non puoi ottenerlo con un solo comando ma puoi farlo con 2 comandi. Puoi scrivere uno script lua per renderli atomici.

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

Lrange list -100 -1

Questo ti elencherà i primi 100 elementi nell'elenco. qui l'offset è -100. Notare che questo restituirà gli elementi nell'ordine opposto in cui è stato inserito. Quindi è necessario invertire il ciclo per garantire il meccanismo della coda.

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

ltrim list 0 -101

Questo taglierà i primi 100 elementi nell'elenco. qui 101 è n+1 quindi deve essere 101. Qui offset è 101

Scriverli all'interno di un blocco lua ti garantirà l'atomicità.

Ti faccio un semplice esempio.

Inserisci 100 elementi in un unico posto.

lpush list 1 2 3 .. 100

Hai più client ciascuno che tenta di accedere a questo blocco lua. Supponiamo che il tuo valore n sia 5 qui. 1stclient entra e ottiene i primi 5 elementi inseriti.

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

Li tieni nel tuo oggetto lua e li elimini.

127.0.0.1:6379> LTRIM list 0 -6
OK

riportali al tuo codice, ora il risultato che vuoi è 1 2 3 4 5 ma quello che hai è 5 4 3 2 1. Quindi devi invertire il ciclo ed eseguire l'operazione.

Quando il prossimo client arriverà, riceverà il prossimo set di valori.

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

In questo modo puoi soddisfare la tua esigenza. Spero questo sia di aiuto.

MODIFICA:

Scritto Lua:

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