Redis блокировка одного экземпляра с помощью SETNX - PullRequest
3 голосов
/ 14 июня 2019

Мне нужно подключиться к одному экземпляру Redis из приложения-клиента.

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

После некоторого поиска и поиска я обнулел эти два ресурса:

Интересно, что документы SETNX явно рекомендуют не использовать SETNX для реализации блокировок, заявляя, что он в основном устарел:

следующий шаблон не рекомендуется в пользу алгоритма Redlock [...]

Мы все равно документируем старый шаблон, потому что некоторые существующие реализации ссылаются на эту страницу в качестве ссылки.

ОднакоАлгоритм Redlock специально предназначен для распределенных блокировок, таким образом, когда кто-то пытается заблокировать несколько экземпляров Redis - они фактически ссылаются на несколько master .

Чтобы пойти немного дальше, библиотека redsync (golang) объявляет функцию New следующим образом:

func New(pools []Pool) *Redsync {
    return &Redsync{
        pools: pools,
    }
}

Она безошибочно разработана для поддержки блокировки накластер Redis.

В моем случае я собираюсь подключиться только к одному экземпляру Redis.

Возможно, я могу просто использовать пакет redsync и передать массив длины один, но для меня это выглядитнапример, шаблон SETNX может одинаково хорошо работать на одном экземпляре Redis.

Правильно ли я это вижу?Спасибо

1 Ответ

3 голосов
/ 14 июня 2019

Да, это правда, что алгоритм Redlock предназначен для распределенной системы Redis, и что если вы используете один экземпляр, то будет хорошо использовать более простые методы блокировки, описанные в SET и SETNX документация.

Однако, более важный момент заключается в следующем: вам, вероятно, не нужно использовать блокировки, чтобы избежать конфликтов между несколькими клиентами Redis . Блокировки Redis обычно используются для защиты некоторых внешних распределенных ресурсов (подробнее об этом см. Мой ответ здесь ). Внутри самого Redis блокировки обычно не нужны; благодаря однопоточному характеру Redis многие команды уже являются атомарными, и у вас есть возможность использовать транзакции или сценарии Lua для составления сколь угодно сложных атомарных операций.

Поэтому я советую разработать код клиента для использования атомарности во избежание конфликта, а не пытаться использовать блокировку (распределенную или иную).

...