我在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 +multi允许并发用户。他们说这是因为唯一的redis客户。
然后我发现了该线程是否应该为每个连接创建一个新的Redis客户端?。他们说“绝对不建议为每笔交易生成一个新客户”。我搞不清楚了。
另请注意,我必须向Redis服务器进行身份验证。提前致谢!
第1版:
通过在每次WATCH-MULTI-
EXEC迭代之前创建一个新的客户端连接,我能够使用本地Redis实例使其工作(因此我不使用client.auth)。虽然不确定是否很好,但是现在的结果是100%准确的。
第2版 如果在每次WATCH-MULTI-
EXEC迭代之前创建一个新的客户端连接,然后执行client.auth并等待client.on,则可以正常工作。
问题仍然存在,可以为每次迭代创建新的客户端连接吗?
您的结果完全可以预测。是的。
请记住-node.js是一个线程应用程序。Node.js使用异步输入输出,但是命令应该以redis严格顺序的“请求-
响应”发送。因此,当您仅使用一个连接到Redis服务器时,您的代码和请求将严格并行执行。
查看您的代码:
rc.on('ready', function () {
rc.set("inc",0)
for(var i = 1; i <= 10; i++){
rc.watch("inc")
//10 times row by row call get function. It`s realy means that your written
//in an asynchronous style code executed strict in series. You are using just
//one connection - so all command would be executed one by one.
rc.get("inc",function(err,data){
//Your data variable data = 0 for each if request.
var multi = rc.multi()
data++ //This operation is not atomic for redis so your always has data = 1
multi.set("inc",data) //and set it
multi.exec(function(err,replies){
console.log(replies)
})
})
}
})
要确认这一点,请执行以下步骤:
monitor
命令。输出将是
SET inc 0
WATCH inc
GET inc
.... get command more 9 times
MULTI
SET inc 1
EXEC
.... command block more 9 times
这样一来,您就可以准确地得到上面编写的结果:“在exec回调中获得0个错误,但最终获得“ inc”变量=1。”。
您可以为每次迭代创建新的客户端连接吗?
对于此示例-
是的,它可以解决您的问题。通常,这取决于您要运行多少个“并发”查询。Redis仍然是一个线程,因此这种“并发”意味着将批处理命令并发到Redis引擎的正确方法。
例如,如果使用2个连接,则monitor
可以给出如下所示的内容:
1 SET inc 0 //from 1st connection
2 WATCH inc //from 1st connection
3 SET inc 0 //from 2nd connection
4 GET inc //from 1nd connection
5 WATCH int //from 2nd connection
6 GET inc //from 2nd connection
7 MULTI //from 1st connection
8 SET inc 1 //from 1st connection
9 MULTI //from 2nd connection
10 SET inc 1 //from 2nd connection
11 EXEC //from 1st failed becouse of 2nd connection SET inc 0 (line 3)
//was executed after WATCH (line 2)
12 EXEC //success becouse of MULTI from 1st connection was failed and SET inc 1 from first
//connection was not executed
-------------------------------------------------------------------------------> time
| | | | | | | | | | | |
connection 1 set watch | get | | multi set | | exec(fail) |
connection 2 set watch get multi set exec
了解redis如何执行命令非常重要。Redis是单线程的,来自所有连接的所有命令都一行一行地执行。Redis不能保证一个连接中的命令会连续执行(如果这里存在另一个连接),因此如果要确保命令执行了一个块(如果需要),则应该使用MULTI。但是为什么需要WATCH?看看我上面的redis命令。您可以看到来自不同连接的命令混合在一起。并观看让您管理。
这在 文档中得到了很好的解释。请阅读!
客户端要做的是: 连接服务器 发送信息 发送的每个信息,等待和接收从服务器返回的同样的信息 关闭连接 用 ChannelHandler 实现客户端逻辑 跟写服务器一样,我们提供 ChannelInboundHandler 来处理数据。下面例子,我们用 SimpleChannelInboundHandler 来处理所有的任务,需要覆盖三个方法: channelActive() - 服务器的连接被建立
问题内容: 我正在使用RMI编写密码系统的原型。 我有一个问题,因为当我启动两个客户端时,它们从OneTimePad类的服务器中的一个对象获得了响应。 因此客户端A获取为客户端b保留的密钥,由于特定的算法,这种情况不会发生。 服务器仅向客户端发送E和N变量(例如在RSA中),因此我无法序列化OneTimePad对象并通过网络发送它(因为它将具有所有密钥)。 如何为每个客户端创建OneTimePad
我有一个包含10个微服务的微服务架构,每个微服务提供一个客户端。在由微服务团队管理/控制的客户机内部,我们只接收参数并将它们传递给一个通用http调用程序,该调用程序接收endpoint和N个params,然后进行调用。所有微服务都使用http和web api(我猜技术并不重要)。 对于我来说,作为微服务团队提供一个客户是没有意义的,应该是消费者的责任,如果他们想创建一些抽象或者直接调用它是他们的
我正在开发一个具有多个客户端的标准java RMI服务器。这些客户机有一个菜单,在那里他们可以调用服务器为他们做各种事情。 一种方法涉及一个队列,他们可以在其中将作业发送到队列并等待它得到处理。RMI服务器自动为所有客户端处理线程,但当涉及到此方法和队列时,我如何阻止此请求,例如: 首先调用客户端1,然后再调用客户端2(此处客户端1应首先从服务器接收消息,客户端2应等待服务器处理客户端1请求所需的
我正在使用Datagramsocket和DatagramPacket制作一个简单的server_client应用程序。我想做的是:一个客户端将数据发送到服务器,服务器将这些数据发送到另一个客户端。问题是服务器从第一个客户端接收数据,但不将它们发送到另一个客户端,我怎么知道我将发送到的客户端的端口?端口没有改变吗? 这是客户端类: 服务器类: }
我使用生成的app engine Android客户端(jar lib)。31个客户中有30个没有问题。但三星的一款平板电脑拒绝连接并给出了这样的死机: Android:4.4.4制造商:三星型号:SM-T533-日期:Mon Aug 03 09:49:03 CEST 2015 ApiUtils类: