2016-12-05 6 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 
Смежные вопросы