只有在<某些数字时Redis才会增加?
问题描述:
如何在一个密钥上调用.incr,并且只有在结果编号是<而不是某个数字时才会增加,而无需事先调用.get?只有在<某些数字时Redis才会增加?
事先调用.get的原因有问题,因为如果我有多个线程。可能有100个线程执行了下面的第一行,它们都得到值“0”,结果是所有增量。竞赛条件,如果你愿意的话。
currentVal = $redis.get('key') #all threads could be done executing this but not yet the below if condition.
if(currentVal < 3)
$redis.incr('key') #1
end
答
您可以使用WATCH
/MULTI
/EXEC
语义乐观锁,或者组成一个Lua像这样的(未测试):
local r=redis.call('GET', KEYS[1])
if r < ARGV[1] then
redis.call('INCR', KEYS[1])
end
我已经尝试过这样做和似乎可能的唯一方法是使用Lua脚本。你可以请求一个像“INCRBYTOMAX”这样的命令。 – tadman
如果currentVal是硬编码的,你不能在'incr'和'decr'之后进行检查吗? –