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

Il comando redis incr può essere limitato a un numero specifico?

Potresti usare un piccolo script Lua per eseguire l'incremento all'interno di Redis stesso in modo che sia essenzialmente a thread singolo:

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

Invece di digitare lo script, puoi anche inserire il codice Lua in un file chiamato IncWithCap.lua così:

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

Quindi puoi caricarlo in Redis con:

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

Risultato campione

"6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1"

Quindi puoi chiamarlo/eseguirlo con:

127.0.0.1:6379> evalsha 6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1 1 CappedInt get