目录

Redis管道技术

李羽秋
李羽秋 2022年03月03日  ·  阅读 1,057

Redis管道技术

1.为什么使用管道技术?

redis客户端与服务器之间使用TCP协议进行通信,并且很早就支持管道技术了。再某些高并发的情境下,网络开销成了redis速度的瓶颈,所以需要使用管道技术来实现突破

我们来看一下执行一条redis命令需要进行以下几步

  • 客户端发送redis命令,阻塞等待redis应答
  • redis接收到命令,执行命令
  • 应答,客户端 收到响应信息

image-20220303181750300

其中 1 、3 称之为一次 RTT(Round Trip Time)。在这种情况下,如果同时执行大量命令,那当前命令需要等待上一条命令应答完成后才会执行,这个过程不仅仅只有多次 RTT,还有频繁的调用系统 IO,发送网络请求,如下图:

image-20220303181829306

把大量的时间消耗在来回路上,真正办事的时间就只有一点点,这种做法是非常不明智且低效的,为了解决这种低效的做法,pipeline 出现了,它允许客户端一次性发送多条命令,减少 RTT 和 IO 的调用次数(IO 调用涉及到用户态到内核态之间的切换)。如下图:

image-20220303181858775

2.实现原理

要支持 pipeline,除了需要 Redis 服务端支持,也需要各个客户端的支持,例如 jedis 就对 pipeline 提供了很好的支持。对于服务端来说,所需要的就是能够处理客户端通过一个 TCP 连接发送的多个命令,对多个命令进行排队,执行。而客户端,则需要将多个命令缓存起来,待缓冲区满了就发送,同时还需要处理 Redis 的应答。

pipeline 不是什么新鲜技术,很多技术都使用过,它能提供性能的核心就在于: 它能将一组 Redis 命令进行组装,通过一次 RTT 传输给 Redis,同时再将这组命令的执行结果按照顺序返回给客户端 。将原来一组命令多次 RTT 以及 IO 交互变成了一组 RTT 和 IO 交互,大大减少了网络传输时间和 IO 调用的时间。

3.管道符使用

我们是在linux环境下进行操作

  1. 首先安装nc这个工具

    yum install nc -y
    
  2. 我们新建一个a.txt,里面内容:

    set k100 v100
    set k200 v200
    hset k300 name haha
    hset k300 age 20
    hset k300 gender male
    
  3. 执行以下命令

    cat a.txt | redis-cli --pipe
    
  4. 登录redis客户端看命令是否执行,我们可以看到

    image-20220303182754072

参考:https://cloud.tencent.com/developer/article/1734649

https://www.cmsblogs.com/article/1391390787534721024

分类: redis
标签: