【发布时间】:2013-03-24 12:07:58
【问题描述】:
我在 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 and watch + multi allows concurrent users。他们说这是因为唯一的 redis 客户端。
然后我找到了这个帖子Should I create a new Redis client for each connection?。他们说“绝对不推荐”为每笔交易生成一个新客户。我迷路了。
还请注意,我必须对 Redis 服务器进行身份验证。提前致谢!
第 1 版:
通过在每次 WATCH-MULTI-EXEC 迭代之前创建新的客户端连接,我能够使用本地 Redis 实例(因此我不使用 client.auth)使其工作。虽然不确定它是否好,但现在结果是 100% 准确的。
第 2 版 如果我在每次 WATCH-MULTI-EXEC 迭代之前创建一个新的客户端连接,然后执行 client.auth 并等待 client.on,它就可以工作。
问题依然存在,每次迭代都创建新的客户端连接可以吗?
【问题讨论】:
标签: javascript node.js redis node-redis