只有在<某些数字时Redis才会增加?

只有在<某些数字时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 
+0

我已经尝试过这样做和似乎可能的唯一方法是使用Lua脚本。你可以请求一个像“INCRBYTOMAX”这样的命令。 – tadman

+0

如果currentVal是硬编码的,你不能在'incr'和'decr'之后进行检查吗? –

您可以使用WATCH/MULTI/EXEC语义乐观锁,或者组成一个Lua像这样的(未测试):

local r=redis.call('GET', KEYS[1]) 
if r < ARGV[1] then 
    redis.call('INCR', KEYS[1]) 
end