我正在使用RedisOnGo + node_redis作为客户端,结合NodeJS + Express + Redis。由于我希望实现高并发,因此尝试测试WATCH。该示例不包含Express,只有必要的内容。
var redis = require("redis")
var rc = redis.createClient(config.redis.port, config.redis.host)
rc.auth(config.redis.hash, function(err) {
if (err) {
throw err
}
})
rc.on('ready', function () {
rc.set("inc",0)
for(var i=1;i<=10;i++){
rc.watch("inc")
rc.get("inc",function(err,data){
var multi = rc.multi()
data++ // I do know I can use rc.incr(), this is just for example
multi.set("inc",data)
multi.exec(function(err,replies){
console.log(replies)
})
})
}
})
期望结果: 在执行回调函数时得到N个错误,最终得到"inc"变量=10-N。
意外的结果: 在执行回调函数时得到0个错误,但最终得到"inc"变量=1。我的代码中Watch不起作用。
我找到了这个主题redis and watch + multi allows concurrent users。他们说这是因为只有一个redis客户端。
然后我找到了这个主题Should I create a new Redis client for each connection?。他们说每个事务生成一个新客户端“绝对不推荐”。我很迷茫。
请注意,我必须对Redis服务器进行身份验证。谢谢! 更新 1: 我能够使用本地Redis实例(因此我不使用client.auth)在每个WATCH-MULTI-EXEC迭代之前创建一个新的客户端连接来使其工作。不确定它是否好,但现在的结果是100%准确的。 更新 2:如果我在每个WATCH-MULTI-EXEC迭代之前创建一个新的客户端连接,然后做client.auth并等待client.on,我就能使它工作。
问题仍然存在,我为每个迭代创建新的客户端连接是否可以?