Redis INCRBY with limits

我想知道在Redis中是否有一种方式可以使我的应用程序通过单次往返来执行以下操作:

对于给定的键 K,其可能的值 V 是范围 [A, B] 内的任意整数。 基本上,它具有上限和下限。

当发出 INCRBYDECRBY 命令(例如 INCRBY key 10)时,它将仅在结果值不超出范围时执行。

我需要这个操作是原子性的,并且我想知道是否有一种避免使用Lua脚本的方法。

谢谢。

点赞
用户5384363
用户5384363

这个答案可能不是你想要的。但我不得不说,Lua 脚本是清晰明了的解决方案。

-- range-incrby.lua key , increment
local key = KEYS[1]
local increment = ARGV[1]
local cnt = redis.call('get', key) or 0
cnt = cnt + increment
if (cnt >= 0 and cnt <= 100) then
    redis.call('set', key, cnt)
    return cnt
end

此外,如果范围为 [0,2 ^ N-1],则可以使用具有溢出控制的 BITFIELD 命令来解决问题。

BITFIELD key OVERFLOW FAIL INCRBY uN 0 increment

然而,这似乎不是你的情况。

2017-04-26 16:35:16
用户7649195
用户7649195

我必须同意 Lua 脚本解决方案清晰高效。在这种情况下,可以实现采用限制和减量作为参数的另一种变体,如下所示。

local value=redis.call("get", KEYS[1]) or 0
local decrement=tonumber(ARGV[1])
local limit=tonumber(ARGV[2])

if (value - decrement) < limit then value = redis.call("decrby", KEYS[1], value - limit)
else value = redis.call("decrby", KEYS[1], decrement) end
return value
2022-04-26 10:18:07