Исходный код вики Транзакции
Версия 1.3 от Alexandr Fokin на 2022/11/01 00:34
Последние авторы
author | version | line-number | content |
---|---|---|---|
1 | Transactions | ||
2 | [[https:~~/~~/redis.io/docs/manual/transactions/>>url:https://redis.io/docs/manual/transactions/]] | ||
3 | |||
4 | Как же работают транзакции в Redis | ||
5 | [[https:~~/~~/habr.com/ru/post/165223/>>url:https://habr.com/ru/post/165223/]] | ||
6 | |||
7 | |||
8 | |(% style="width:232px" %)Оптимистичные блокировки|(% style="width:1250px" %)((( | ||
9 | В рамках сессии позволяет установить наблюдение за значением по ключу. Если значение будет изменено, то redis оповестит об этом и позволит откатить операцию, либо выполнить заново. | ||
10 | |||
11 | Как работает Redis при одновременном доступе нескольких клиентов? | ||
12 | [[https:~~/~~/ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов>>url:https://ru.stackoverflow.com/questions/876405/Как-работает-redis-при-одновременном-доступе-нескольких-клиентов]] | ||
13 | ))) | ||
14 | |(% style="width:232px" %)Пессимистичные блокировки|(% style="width:1250px" %)((( | ||
15 | Не содержит из коробки, но позволяет сконструировать логику блокировки или семафора (ограничение степени параллелизма при выполнении секции) через ручную реализацию. | ||
16 | (При такой реализации все клиенты должны исполнять логику по взятию блокировки, а также ее сброса в случае разрыва соединения) | ||
17 | |||
18 | Distributed Locks with Redis | ||
19 | [[https:~~/~~/redis.io/docs/reference/patterns/distributed-locks/>>https://redis.io/docs/reference/patterns/distributed-locks/]] | ||
20 | |||
21 | Распределенные блокировки с применением Redis | ||
22 | [[https:~~/~~/habr.com/ru/company/piter/blog/518218/>>https://habr.com/ru/company/piter/blog/518218/]] | ||
23 | ))) | ||
24 | |||
25 | ---- | ||
26 | |||
27 | Команда {{code language="none"}}MULTI{{/code}} обозначает, что все команды, идущие после и выполняющие изменение данных, будут накапливаться и будут выполнены при вызове команды {{code language="none"}}EXEC{{/code}}. При этом команды чтения данных не попадают в транзакцию а выполняются сразу же. | ||
28 | |||
29 | Шаблон оптимистичной блокировки. | ||
30 | |||
31 | {{code language="none"}} | ||
32 | // Устанавливаем наблюдение за ключом | ||
33 | WATCH mykey | ||
34 | |||
35 | // Считываем значение в переменную и обновляем ее | ||
36 | val = GET mykey | ||
37 | val = val + 1 | ||
38 | |||
39 | // Запускаем обновляющую транзакцию | ||
40 | // Транзакция накладывает свои свойства только на команды обновления данных. | ||
41 | // ПОэтому считыванием значений мы выполняем до Multi. | ||
42 | MULTI | ||
43 | SET mykey $val | ||
44 | EXEC | ||
45 | |||
46 | //В случае, если в процессе выполнения значение по ключу mykey будет изменено операциями других сессий (относительно захваченного в watch значения), то запрос завершится ошибкой. | ||
47 | {{/code}} | ||
48 | |||
49 | ---- |