Asnwer
Нет документации относительно использования WATCH в node-redis.Однако я нашел чрезвычайно полезный набор советов в MDN:
https://developer.mozilla.org/en-US/docs/Mozilla/Redis_Tips
В целом, WATCH следует использовать следующим образом:
var redis = require("redis"),
client = redis.createClient({ ... });
client.watch("foo", function( err ){
if(err) throw err;
client.get("foo", function(err, result) {
if(err) throw err;
// Process result
// Heavy and time consuming operation here
client.multi()
.set("foo", "some heavy computation")
.exec(function(err, results) {
/**
* If err is null, it means Redis successfully attempted
* the operation.
*/
if(err) throw err;
/**
* If results === null, it means that a concurrent client
* changed the key while we were processing it and thus
* the execution of the MULTI command was not performed.
*
* NOTICE: Failing an execution of MULTI is not considered
* an error. So you will have err === null and results === null
*/
});
});
});
Итак,чтобы ответить на мои вопросы:
- Да, хотя
watch
вызывается для прототипа RedisClient
, а не для прототипа Multi
. - Фрагмент кода, представленный выше.
- Поскольку каждый метод из объекта, который имеет прототип
Multi
, возвращает сам объект, использование версий методов Async
не дает никаких преимуществ, за исключением execAsync
, который позволяет выполнять несколько запросов ииметь дело с ответом в Обещании вместо обратного вызова.
Важные замечания
Еще одна очень важная вещь заключается в том, что watch
работает только для KEYS, не для хэшей .Так что в моем случае вы не можете наблюдать поле array
хеша test
.Вы можете просматривать весь набор test
, но не конкретное поле.
Итак, потому что в моем коде я действительно хочу посмотреть поле в хэше.Это невозможно.Вместо этого я должен использовать систему именования ключей, которая вместо этого позволит:
var redis = require( "redis" );
var bluebird = require( "bluebird" );
var client = redis.createClient();
var multi = client.multi();
client.watchAsync( "test_array" )
then( ( ) =>
multi.set( "test_array", "[1, 2]" )
.get( "test_array" )
.execAsync( )
)
.then( console.log ); // [ 0, "[1, 2]" ]
Документация для этого очень скудна, но я надеюсь, что этот вопрос поможет кому-то в будущем.
Если вы читаете это из будущего, теперь вы можете насладиться моим личным вкладом в проект node_redis
и проверить обновленную документацию: