Redis管道技术
Redis管道技术
1.为什么使用管道技术?
redis客户端与服务器之间使用TCP协议进行通信,并且很早就支持管道技术了。再某些高并发的情境下,网络开销成了redis速度的瓶颈,所以需要使用管道技术来实现突破
我们来看一下执行一条redis命令需要进行以下几步
- 客户端发送redis命令,阻塞等待redis应答
- redis接收到命令,执行命令
- 应答,客户端 收到响应信息
其中 1 、3 称之为一次 RTT(Round Trip Time)。在这种情况下,如果同时执行大量命令,那当前命令需要等待上一条命令应答完成后才会执行,这个过程不仅仅只有多次 RTT,还有频繁的调用系统 IO,发送网络请求,如下图:
把大量的时间消耗在来回路上,真正办事的时间就只有一点点,这种做法是非常不明智且低效的,为了解决这种低效的做法,pipeline 出现了,它允许客户端一次性发送多条命令,减少 RTT 和 IO 的调用次数(IO 调用涉及到用户态到内核态之间的切换)。如下图:
2.实现原理
要支持 pipeline,除了需要 Redis 服务端支持,也需要各个客户端的支持,例如 jedis 就对 pipeline 提供了很好的支持。对于服务端来说,所需要的就是能够处理客户端通过一个 TCP 连接发送的多个命令,对多个命令进行排队,执行。而客户端,则需要将多个命令缓存起来,待缓冲区满了就发送,同时还需要处理 Redis 的应答。
pipeline 不是什么新鲜技术,很多技术都使用过,它能提供性能的核心就在于: 它能将一组 Redis 命令进行组装,通过一次 RTT 传输给 Redis,同时再将这组命令的执行结果按照顺序返回给客户端 。将原来一组命令多次 RTT 以及 IO 交互变成了一组 RTT 和 IO 交互,大大减少了网络传输时间和 IO 调用的时间。
3.管道符使用
我们是在linux环境下进行操作
-
首先安装nc这个工具
yum install nc -y
-
我们新建一个a.txt,里面内容:
set k100 v100 set k200 v200 hset k300 name haha hset k300 age 20 hset k300 gender male
-
执行以下命令
cat a.txt | redis-cli --pipe
-
登录redis客户端看命令是否执行,我们可以看到
参考:https://cloud.tencent.com/developer/article/1734649