2016-12-05 63 views
0

如何在一個密鑰上調用.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'之後進行檢查嗎? –

回答

1

您可以使用WATCH/MULTI/EXEC語義樂觀鎖,或者組成一個Lua像這樣的(未測試):

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