Есть ли функция redis, выполняющая цинкерби с верхним и нижним пределом? - PullRequest
0 голосов
/ 18 октября 2019

Можно ли выполнить цинкерби с верхним и нижним пределом, чтобы воспользоваться преимуществом функции атома redis?

zadd set1 1 a 2 b 
zincby -2 a
zrevrange set1 0 -1 withscores

--> instead of 
** b 2 a -1 **

how to get 
** b 2 a 0 **

with a single redis function?

1 Ответ

2 голосов
/ 18 октября 2019

Нет такой встроенной функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...