在Redis中设置计数器的预定义范围

时间:2016-03-29 16:11:31

标签: redis range counter

如何在设置Redis时预定义一系列计数器。我希望计数器具有预定义的MAX和MIN值(特别是在我的情况下MIN值为0),这样如果值超过此范围,INCR或DECR将返回错误。我浏览了Redis文档,但没有找到任何答案。

1 个答案:

答案 0 :(得分:0)

Redis不提供此内置功能,但您可以使用它自行构建。有很多方法可以做到这一点,我个人的偏好是使用Lua脚本 - 阅读EVAL以获得更多背景。

在这种情况下,我会使用这个脚本:

local val = tonumber(redis.call('GET', KEYS[1]))
if not val then
    val = 0
end

local inc = val + tonumber(ARGV[1])
if inc < tonumber(ARGV[2]) or inc > tonumber(ARGV[3]) then
    error('Counter is out of bounds')
else
    return redis.call('SET', KEYS[1], inc)
end

以下是从命令行运行的示例的输出:

$ redis-cli --eval incrbyminmax.lua foo , 5 0 10
(integer) 5
$ redis-cli --eval incrbyminmax.lua foo , 5 0 10
(integer) 10
$ redis-cli --eval incrbyminmax.lua foo , 5 0 10
(error) ERR Error running script (call to f_ada0f9d33a6278f3e55797b9b4c89d5d8a012601): @user_script:8: user_script:8: Counter is out of bounds 
$ redis-cli --eval incrbyminmax.lua foo , -9 0 10
(integer) 1
$ redis-cli --eval incrbyminmax.lua foo , -9 0 10
(error) ERR Error running script (call to f_ada0f9d33a6278f3e55797b9b4c89d5d8a012601): @user_script:8: user_script:8: Counter is out of bounds