Redis
 sql >> база данни >  >> NoSQL >> Redis

Елемент от списъка Redis Pop По брой елементи

Предполагам, че работите наопашка , където вмъквате 1000 елемента на едно място и ги извличате на няколко места в реда, в който са вмъкнати .

Не можете да го постигнете с една команда, но можете да го направите с 2 команди. Можете да напишете lua скрипт, за да ги направите атомарни.

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

Lrange list -100 -1

Това ще ви изброи първите 100 елемента в списъка. тук отместването е -100. Имайте предвид, че това ще върне елементите в обратния ред, в който са вмъкнати. Така че трябва да обърнете цикъла, за да осигурите механизма на опашката.

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

ltrim list 0 -101

Това ще отреже първите 100 елемента в списъка. тук 101 е n+1, така че трябва да е 101. Тук изместването е 101

Записването им в блок lua ​​ще ви гарантира атомарността.

Нека ви дам прост пример.

Вмъквате 100 елемента на едно място.

lpush list 1 2 3 .. 100

Имате множество клиенти, които се опитват да осъществят достъп до този lua блок. Да кажем, че стойността ви n е 5 тук. 1-ви клиент влиза и получава вмъкнати първите 5 елемента.

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

Запазвате ги във вашия lua обект и ги изтривате.

127.0.0.1:6379> LTRIM list 0 -6
OK

върнете ги във вашия код, сега резултатът, който искате, е 1 2 3 4 5, но това, което имате, е 5 4 3 2 1. Така че трябва да обърнете цикъла и да изпълните операцията.

Когато влезе следващият клиент, той ще получи следващия набор от стойности.

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

По този начин можете да постигнете вашето изискване. Надявам се това да помогне.

РЕДАКТИРАНЕ:

Lua скрипт:

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Това добър случай ли е на използване на Redis в ServiceStack REST API?

  2. Redis Cache в .NET Core 3 изисква ли използването на пакета Stack Exchange?

  3. изключете redis-сървъра от командния ред

  4. Алгоритъм за съпоставяне на потребители

  5. Как работи redis, за да помогне за постоянството на сесията в лазурен прозорец