Фон
У меня есть атомарная операция, и мне нужно использовать блокировку, чтобы другие клиенты не могли прочитать нестабильное значение.
- Платформа: узел 10.1.0.
- Библиотека: redis
Решение
Согласно официальной документации, решением для этого является использование WATCH
вместе с MULTI
:
Проблема
Теперь использование MULTI
задокументировано, и у меня есть общее представление о том, как я могу его использовать.
var redis = require( "redis" );
var bluebird = require( "bluebird" );
var client = redis.createClient();
var multi = client.multi();
multi.hsetAsync( "test", "array", "[1, 2]" );
multi.hgetAsync( "test", "array" );
multi.execAsync( ).then( console.log ); // [ 0, "[1, 2]" ]
Я понимаю, что это правильная реализация multi. Сначала мне нужно создать клиента, а затем я создаю множественный запрос.
Я понимаю, что multi
и client
используют один и тот же интерфейс, но также неясно, какие преимущества (если есть) я получаю от использования hgetAsync
вместо hget
в запросе multi
, поскольку я предполагаю, что все, что делает multi, это добавляет указанные запросы в очередь синхронно (поэтому мне не нужен асинхронный вариант).
При вызове multi.execAsync( )
выполнение запроса произойдет атомарно.
Но я не понимаю, как WATCH
должен войти сюда. Я не смог найти никаких упоминаний об этом в документации, ничего о системе оптимистической блокировки, которая есть в REDIS.
Вопросы
Итак, у меня есть следующие вопросы:
- Поддерживается ли
WATCH
сMULTI
? - Если да, то не могли бы вы поделиться фрагментом кода?
- Имеет ли смысл в этом примере использовать
multi.hgetAsync( "test", "array" );
вместоmulti.hget( "test", "array" );
?