2016-12-05 4 views
0

.incrをキーで呼び出す方法と、結果の数値が特定の数値より<の場合にのみインクリメントさせる方法は、あらかじめ.getを呼び出す必要はありませんか?<特定の数字の場合のみ、赤字増分?

私が複数のスレッドを持っている場合、.getを事前に呼び出すのは問題があります。下の最初の行を実行したスレッドが100個ある可能性があります。これらのスレッドはすべて値「0」を取得し、結果としてすべての増分を取得します。競争条件、もしあれば。

あなたは楽観的ロックに WATCH/ MULTI/ EXECセマンティクスを使用するか、または、そのような本1(テストしていない)としてのLuaを構成するか
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

local r=redis.call('GET', KEYS[1]) 
if r < ARGV[1] then 
    redis.call('INCR', KEYS[1]) 
end 
関連する問題