Redis仅在<一定数量?

时间:2016-12-05 19:22:04

标签: ruby redis

如何在密钥上调用.incr,并且只有在结果数字为<不必事先打电话给.get,而不是一定数量?

之前调用.get的原因是有问题的,因为如果我有多个线程。可能有100个线程执行了下面的第一行,它们都获得了值#34; 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

1 个答案:

答案 0 :(得分:1)

您可以使用WATCH / MULTI / EXEC语义进行乐观锁定,也可以编写Lua(如未测试):

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