Нет такой встроенной функции Redis, но составить сценарий Lua не должно быть слишком сложно (для получения дополнительной информации см. Документацию EVAL
команды ), которая делает это:
127.0.0.1:6379> ZADD set1 1 a 2 b
(integer) 2
127.0.0.1:6379> EVAL "local val = redis.call('ZINCRBY', KEYS[1], ARGV[1], ARGV[2]) if tonumber(val) < 0 then redis.call('ZADD', KEYS[1], 0, ARGV[2]) end return val" 1 set1 -2 a
(integer) 0
127.0.0.1:6379> ZREVRANGE set1 0 -1 WITHSCORES
1) "b"
2) "2"
3) "a"
4) "0"
Вот тот же скрипт, отформатированный только для удобства чтения:
local val = redis.call('ZINCRBY', KEYS[1], ARGV[1], ARGV[2])
if tonumber(val) < 0 then
redis.call('ZADD', KEYS[1], 0, ARGV[2])
end
return val