2014-11-06 3 views
1

В моем бизнес-приложении я планирую хранить баланс пользователя в кеш-сервере Redis, позволяя нескольким процессам потреблять баланс. Но в тот момент, когда сумма падает до 0, я хочу, чтобы процессы «терпели неудачу», потребляя баланс.У Redis есть функция decr, если функция

На данный момент я не могу этого достичь. Например, скажем, баланс равен 1 INR или $, и каждый из 2 потоков хочет его использовать. Каждый поток получает и decr. Поэтому иногда случается, что значение падает ниже 0, так как нет атомной операции, такой как «DECR IF», аналогичной «сравнивать и устанавливать».

Можно ли достичь этого любым другим способом?

ответ

1

Хотя для этого не существует одной команды в Redis, вы можете использовать ее transactions с командой WATCH для этой цели. Следующий псевдокод из Оптимистической блокировки с помощью чек-и-набор подраздела в основном ответ на ваш вопрос:

WATCH mykey 
val = GET mykey 
val = val + 1 
MULTI 
SET mykey $val 
EXEC 
Смежные вопросы