1。请求-响应协议和RTT:
redis是基于C/S
模式的一个典型的TCP
服务器。在沟通的过程中客户端和服务器端,客户端通常率先发起的请求,
执行相应的
任务,服务器接收请求后,最后将采集到的数据或
处理结果回复客户。在这个过程中,客户在一个封锁的方式
等待服务器返回的结果。看到下面的
命令序列:
复制代码代码如下所示:
客户:增加X
服务器:1
客户:增加X
服务器:2
客户:增加X
服务器:3
客户:增加X
服务器:4
在请求和响应的每一对,我们要承担
网络传输额外的开销。通常我们称这种开销的RTT(往返时间)。现在我们假设每个请求和响应时间是250毫秒,和我们的服务器可以在一秒钟100k数据的过程,但结果是,我们的服务器流程4每秒的请求数。为了
解决这个问题,我们应该如何
优化呢
二、管道(流水线):
Redis已经在一个非常早期的版本命令管道提供
支持。在给出具体的解释,我们首先将上述
同步响应模式为一个基于命令行的异步响应模式,这将给你一个更好的感性认识。
复制代码代码如下所示:
客户:增加X
客户:增加X
客户:增加X
客户:增加X
服务器:1
服务器:2
服务器:3
服务器:4
从上面的例子中,我们可以看到,在发送命令,客户端可以不等待来自服务器的回复,但可以继续发送以下命令后,发送命令,所有的命令都会再次阅读之前回答。这节省了在同步模式下的成本。
最后,需要说明的是,如果Redis服务器
发现客户端的请求是基于管道,然后服务器端将收到的每一个命令的应答数据并发送给客户端接收请求,处理后。
三,基准:
以下是从Redis
官网的测试用例和测试结果。需要说明的是,这个测试是基于环回(127.0.0.1),因此RTT占用更少的时间。如果是基于实际的网络接口,那么管道机构的
性能改进将更为重要。
复制代码代码如下所示:
require'rubygems
require'redis
替补席(描述)
起始时间
让
提出# {说明} # { }秒时间。现在开始
终点
DEF without_pipelining
R = redis.new
{ 10000.times
r.ping
}
终点
DEF with_pipelining
R = redis.new
r.pipelined {
{ 10000.times
r.ping
}
}
终点
工作台(没有管道){
without_pipelining
}
工作台(管道){
with_pipelining
}
没有流水线1.185238秒
使用流水线0.250783秒