Redis管道

Redis管道

背景

 redis是一种基于CS模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤:

1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果),并监听Socket返回,通常以阻塞模式等待服务端响应。

2 服务端处理命令,并将结果返回给客户端。

 

上述两步称为:Round Trip Time(简称PTT,数据包往返于两端的时间)。如果同时需要执行大量的命令那么就要等待上一条命令应答后再执行,这中间不仅仅多了RTT(Round Time Trip),而且还频繁调用系统IO,发送网络请求,同时需要redis调用多次read()和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文有比较大的影响了,性能不太好。

说明

管道(pipeline)可以一次性发送多条命令给服务端,服务端依次处理完毕后,通过一条响应一次性将结果返回,通过减少redis与客户端的通信次数来实现降低往返延时时间。pipeline实现的原理是队列,先进先出特性就保证数据的顺序性。

将多个命令打包,一次性发送,以节省交互次数,提升性能。

常用命令

cat

是Linux命令,并非redis的命令。使用这个命令读取文件中存放的redis命令。实现批量命令的一次性发送。

管道功能演示

[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# cat cmd.txt #查看cmd.txt中存储的redis命令
set k100 v100
set k200 v200
hset k300 name haha
hset k300 age 20
hset k300 gender male

[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# cat cmd.txt | redis-cli -a xxxxxx --pipe # 执行命令,使用管道执行批量命令
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 5
[root@iZ2ze4jd3wbsstj2idalpgZ myredis]# redis-cli -a xxxxxx # 进入redis验证命令是否成功执行
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get k100 # k100设置成功,与文件中一致
"v100"
127.0.0.1:6379> hget k300 name # k300设置成功
"haha"
127.0.0.1:6379> 

 

总结

事务与管道之间的区别,以及pipeline的注意事项:

与事务的区别:

管道一次性将多条命令发送到服务器,事务是一条一条的发。使用事务时,会增加redis与客户端的交互次数。

执行事务时会阻塞其他命令的执行,而执行管道中的命令时则不会。

注意事项:

pipeline缓冲的指令只是会一次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令。这也是管道和事务之间的区别,事务具有原子性。

使用pipeline组装的命令个数不能太多,不然数据量过大客户端阻塞的时间可能过久,同时服务端此时也被迫恢复一个队列的答复,占用很多的内存。

 

posted @ 2023-07-09 00:39  邵杠杠  阅读(25)  评论(0编辑  收藏  举报