我在 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)
})
})
}
})
预期结果:在 exec 回调中出现 N 个错误,最后得到“inc”变量 = 10-N。
意外结果:在 exec 回调中出现 0 个错误,但最终得到“inc”变量 = 1。
Watch 不适用于我的代码。
我发现这个线程redis 和 watch + multi 允许并发用户。他们说这是因为唯一的redis客户端。
然后我发现这个线程我应该为每个连接创建一个新的Redis客户端吗?. 他们说“绝对不推荐”为每笔交易生成一个新客户。我搞不清楚了。
另请注意,我必须对 Redis 服务器进行身份验证。提前致谢!
第 1 版:
通过在每次 WATCH-MULTI-EXEC 迭代之前创建一个新的客户端连接,我能够使用本地 Redis 实例(因此我不使用 client.auth)使其工作。虽然不确定它是否好,但现在结果是 100% 准确的。
版本2 如果我在每次 WATCH-MULTI-EXEC 迭代之前创建一个新的客户端连接,然后执行 client.auth 并等待 client.on,它就可以工作。
问题仍然存在,我可以为每次迭代创建新的客户端连接吗?