I'd like to know if there is a way to perform this in redis with a single roundtrip from my app:
For a given key K, its possible value V is any of the integers inside the range [A, B]. Basically, it has an upper and lower boundary.
When an INCRBY or DECRBY command is issued (eg. INCRBY key 10) it will be executed only if the resulting value is not out of bounds.
I need this operation to be atomic, and I wanted to know if there was a way to avoid Lua scripting for this.
Thank you.
解决方案
This answer might not be what you expect. But I have to say that Lua scripting is the crystal clear solution.
-- 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
Also, if the range is [0, 2^N - 1], then you can use BITFIELD command with overflow control to solve the problem.
BITFIELD key OVERFLOW FAIL INCRBY uN 0 increment
However, that seems not your case.