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

Може ли командата redis incr да бъде ограничение до конкретен номер?

Можете да използвате малък Lua скрипт, за да направите увеличението в самия Redis, така че по същество да е еднонишков:

127.0.0.1:6379> set CappedInt 7
OK
127.0.0.1:6379> eval "local c=redis.call(ARGV[1],KEYS[1])+0;if c<10 then return redis.call('INCR',KEYS[1]); else return 10; end" 1 CappedInt get
(integer) 8
127.0.0.1:6379> eval "local c=redis.call(ARGV[1],KEYS[1])+0;if c<10 then return redis.call('INCR',KEYS[1]); else return 10; end" 1 CappedInt get
(integer) 9
127.0.0.1:6379> eval "local c=redis.call(ARGV[1],KEYS[1])+0;if c<10 then return redis.call('INCR',KEYS[1]); else return 10; end" 1 CappedInt get
(integer) 10
127.0.0.1:6379> eval "local c=redis.call(ARGV[1],KEYS[1])+0;if c<10 then return redis.call('INCR',KEYS[1]); else return 10; end" 1 CappedInt get
(integer) 10

Вместо да пишете в скрипта, можете също да поставите Lua кода във файл, наречен IncWithCap.lua така:

local cap=10
if(redis.call(ARGV[1],KEYS[1])+0 < cap) then
   return redis.call('INCR',KEYS[1])
end
return cap

След това можете да го заредите в Redis с:

redis-cli SCRIPT LOAD "$(cat IncWithCap.lua)"

Изходен пример

"6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1"

След това можете да го извикате/изпълните с:

127.0.0.1:6379> evalsha 6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1 1 CappedInt get



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Време за изчакване на спасяване::Грешка от Redis Gem (Ruby)

  2. Джедаи - Кога да използваме returnBrokenResource()

  3. Redis свързва ECONNREFUSED в NodeJS в клъстер Kubernetes

  4. docker-compose:връзката на Redis е отказана между контейнерите

  5. nginx uwsgi websockets 502 Лош шлюз нагоре по веригата преждевременно затворена връзка, докато чете заглавката на отговора от горния поток