我想知道是否有办法通过我的应用程序的单次往返在 redis 中执行此操作:
对于给定的键K,其可能的值V是范围内的任何整数[A, B]。基本上,它有一个上下边界。
当发出INCRBYorDECRBY命令时(例如INCRBY key 10),只有当结果值没有超出范围时才会执行。
我需要这个操作是原子的,我想知道是否有办法避免为此编写 Lua 脚本。
谢谢你。
这个答案可能不是您所期望的。但我不得不说,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
Run Code Online (Sandbox Code Playgroud)
此外,如果范围是[0, 2^N - 1],那么您可以使用BITFIELD带有溢出控制的命令来解决问题。
BITFIELD key OVERFLOW FAIL INCRBY uN 0 increment
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不是您的情况。