Redis 是一种基于客户端-服务端模型(Client-Server),请求/响应协议(Request/Response)的 TCP 服务。这意味着通常情况下一个请求会遵循以下步骤:
(1)客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等待服务端响应。
(2)服务端处理命令,并将结果返回给客户端。
注意:阻塞式指只有当客户端接收完当前命令的响应信息,服务端才可以继续处理下一条指令,即一条一条的逐次执行。
Redis 服务器是以单线程的方式来处理客户端的网络 IO 请求。如果每执行一次请求都要创建和断开一次连接,就会消耗过多的时间,导致执行效率降低。不管命令是以数据包的形式从客户端传输到服务端,还是客户端获得服务端的响应信息,这个过程都需要花费一定的时间,我把这个时间称为 “往返延时”。因此当客户端执行一串请求的时候很容易看出延时对其性能造成的影响。
如果我们可以减少网络请求的次数,那么就可以大幅度提高 Redis 应用性能。因此,Redis 提供了 Pipeline 管道技术,使用该技术可以一次性向服务器发送多条命令,并返回多个执行结果,从而减少多次请求的 “往返时间”。
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
Pipeline 技术有其固定的语法格式,以下是在 Linux 终端执行的语句,具体命令如下:
echo -en "PING\r\n SET name www.hxstrive.com\r\n GET name\r\n INCR num\r\n INCR num\r\n INCR num\r\n" | nc localhost 6379
上述语句,首先使用 PING 命令检查 Redis 是否正常工作,然后又分别使用了 SET/GET/INCR 命令,最后将这些命令一次性的提交给 Redis 服务器,Redis 服务器一次性输出了所有命令的响应信息。
注意: 每个命令字符串必须以 \r\n 结尾。至于语句最后的 nc localhost 6379 是固定格式无需更改。
客户端一次性接收到所有命令的执行结果,如下所示:
hxstrive@localhost:~/Desktop$ echo -en "PING\r\n SET name www.hxstrive.com\r\n GET name\r\n INCR num\r\n INCR num\r\n INCR num\r\n" | nc localhost 6379 +PONG +OK $16 www.hxstrive.com :4 :5 :6
注意:上述示例需要在 Linux 系统执行,Windows 由于缺少 nc 命令,无法执行成功。