Транзакции

Версия 1.3 от Alexandr Fokin на 2022/11/01 00:34

Transactions
https://redis.io/docs/manual/transactions/

Как же работают транзакции в Redis
https://habr.com/ru/post/165223/

Оптимистичные блокировки

В рамках сессии позволяет установить наблюдение за значением по ключу. Если значение будет изменено, то redis оповестит об этом и позволит откатить операцию, либо выполнить заново.

Как работает Redis при одновременном доступе нескольких клиентов?
https://ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов

Пессимистичные блокировки

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

Distributed Locks with Redis
https://redis.io/docs/reference/patterns/distributed-locks/

Распределенные блокировки с применением Redis
https://habr.com/ru/company/piter/blog/518218/


Команда MULTI обозначает, что все команды, идущие после и выполняющие изменение данных, будут накапливаться и будут выполнены при вызове команды EXEC. При этом команды чтения данных не попадают в транзакцию а выполняются сразу же.

Шаблон оптимистичной блокировки.

// Устанавливаем наблюдение за ключом
WATCH mykey

// Считываем значение в переменную и обновляем ее
val = GET mykey
val = val + 1

// Запускаем обновляющую транзакцию
// Транзакция  накладывает свои свойства только на команды обновления данных.
// ПОэтому считыванием значений мы выполняем до Multi.
MULTI
SET mykey $val
EXEC

//В случае, если в процессе выполнения значение по ключу mykey будет изменено операциями других сессий (относительно захваченного в watch значения), то запрос завершится ошибкой.