做网站大公司还是小公司,商城网站设计教程,如何编辑 wordpress 主题,山东网站建设优化引言
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。
这意味着通常情况下一个请求会遵循以下步骤#xff1a; 客户端向服务端发送一个查询请求#xff0c;并监听Socket返回#xff0c;通常是以阻塞模式#xff0c;等待服务端响应。服务端处理命令#x…引言
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。
这意味着通常情况下一个请求会遵循以下步骤 客户端向服务端发送一个查询请求并监听Socket返回通常是以阻塞模式等待服务端响应。服务端处理命令并将结果返回给客户端。因此例如下面是4个命令序列执行情况 Client: INCR XServer: 1Client: INCR XServer: 2Client: INCR XServer: 3Client: INCR XServer: 4RTT (Round Trip Time - 往返时间). 当客户端需要在一个批处理中执行多次请求时很容易看到这是如何影响性能的例如添加许多元素到同一个list或者用很多Keys填充数据库。
例如如果RTT时间是250毫秒在一个很慢的连接下即使服务器每秒能处理100k的请求数我们每秒最多也只能处理4个请求。
一、Redis 管道Pipelining
服务器能实现即使旧的请求还未被响应新的请求也可以被处理这就是管道的含义。它是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能大大加快了从服务器下载新邮件的过程。
Redis很早就支持管道pipelining技术因此无论你运行的是什么版本你都可以使用管道pipelining操作Redis。
例如
$ (printf PING\r\nPING\r\nPING\r\n; sleep 1) | nc localhost 6379
PONG
PONG
PONG
非常明确的用管道顺序操作的第一个例子如下
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4 注意使用管道发送命令时务器将被迫回复一个队列答复占用很多内存。 所以如果你需要发送大量的命令最好是把他们按照合理数量分批次的处理例如10K的命令读回复然后再发送另一个10k的命令等等。这样速度几乎是相同的但是在回复这10k命令队列需要非常大量的内存用来组织返回数据内容。