Search code examples
luaredis

Redis INCRBY with limits


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.


Solution

  • 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.