没有关于在节点redis中使用WATCH的文档。但是,我确实在MDN中找到了一组非常有用的提示:
https://developer.mozilla.org/zh-CN/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
它使您可以执行多个查询并在Promise中处理响应而不是回调。
另一个真正重要的事情是watch
仅适用于KEYS,而不适用于哈希。因此,就我而言,您无法查看array
hash 的字段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
项目的个人贡献并查看更新的文档:
https://github.com/NodeRedis/node_redis#optimistic-locks