sql >> Databáze >  >> NoSQL >> Redis

Položka seznamu Redis Pop Podle počtu položek

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


  1. TypeError:db.collection není funkce

  2. Dotazování prvků pole pomocí Mongo

  3. Existuje nějaký klient Redis (preferovaná Java), který podporuje transakce na clusteru Redis?

  4. MongoDB, MapReduce a řazení