Проверить и увеличить счетчик в Redis - PullRequest
3 голосов
/ 05 июля 2019

У меня есть операция, которую нужно выполнить N раз и не более.Операция выполняется многими возможно параллельными процессами, которые получают запросы.Процесс должен проверить, не превысил ли счетчик N, и, если нет, увеличить счетчик и выполнить операцию.Я полагаю, что я мог бы использовать счетчик Redis для этого.

Howerver, если я просто GET, а затем INCR значение, которое я мог бы встретить в состоянии гонки, что приведет к выполнению операции более чем N раз,Как мне выполнить какую-то операцию test-and-incr с Redis?

Я знаю, что могу использовать WATCH, но это оптимистичная блокировка.Я ожидаю, что будет очень много столкновений каждую секунду.Это приведет к большому количеству сбоев.Может быть, я мог бы просто обернуть простые GET и INCR каким-нибудь внешним мьютексом.Но я не уверен, достаточно ли это для производительности.

1 Ответ

2 голосов
/ 05 июля 2019
  • Здесь вы можете безопасно использовать Redis INCR.
  • INCR возвращает значение после приращения.

  • Вы проверяете возвращаемое значениесначала по INCR (см. нет необходимости выполнять GET) и продолжить выполнение операции на основе этого значения.

  • Единственное, что вам нужно будет установить пороговое значение возвращаемого значения INCR как N +1 для ограничения N операциями, т.е. одной дополнительной операции повторного отображения, чем N. Например, если мы хотим ограничить выполнение операции только 3 раза, если INCR возвращает 4 после приращения, то вы прекращаете выполнять дальнейшие операции, поскольку это уже произошло 3раз.

enter image description here

...