Redis
 sql >> Base de données >  >> NoSQL >> Redis

La commande redis incr peut-elle être limitée à un nombre spécifique ?

Vous pouvez utiliser un petit script Lua pour effectuer l'incrémentation dans Redis lui-même afin qu'il soit essentiellement monothread :

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

Plutôt que de taper le script, vous pouvez également mettre le code Lua dans un fichier appelé IncWithCap.lua comme ceci :

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

Ensuite, vous pouvez le charger dans Redis avec :

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

Exemple de sortie

"6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1"

Ensuite, vous pouvez l'appeler/l'exécuter avec :

127.0.0.1:6379> evalsha 6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1 1 CappedInt get