Redis教程(十三):管线详解

 更新时间:2015年05月04日 08:42:06   投稿:junjie  
这篇文章主要介绍了Redis教程(十三):管线详解,本文讲解了请求应答协议和RTT、管线(pipelining)、Benchmark等内容,需要的朋友可以参考下

一、请求应答协议和RTT:

    Redis是一种典型的基于C/S模型的TCP服务器。在客户端与服务器的通讯过程中,通常都是客户端率先发起请求,服务器在接收到请求后执行相应的任务,最后再将获取的数据或处理结果以应答的方式发送给客户端。在此过程中,客户端都会以阻塞的方式等待服务器返回的结果。见如下命令序列:
   

复制代码 代码如下:

 Client: INCR X
    Server: 1
    Client: INCR X
    Server: 2
    Client: INCR X
    Server: 3
    Client: INCR X
    Server: 4
 

    在每一对请求与应答的过程中,我们都不得不承受网络传输所带来的额外开销。我们通常将这种开销称为RTT(Round Trip Time)。现在我们假设每一次请求与应答的RTT为250毫秒,而我们的服务器可以在一秒内处理100k的数据,可结果则是我们的服务器每秒至多处理4条请求。要想解决这一性能问题,我们该如何进行优化呢?
   
二、管线(pipelining):

    Redis在很早的版本中就已经提供了对命令管线的支持。在给出具体解释之前,我们先将上面的同步应答方式的例子改造为基于命令管线的异步应答方式,这样可以让大家有一个更好的感性认识。
 

复制代码 代码如下:

    Client: INCR X
    Client: INCR X
    Client: INCR X
    Client: INCR X
    Server: 1
    Server: 2
    Server: 3
    Server: 4
 

    从以上示例可以看出,客户端在发送命令之后,不用立刻等待来自服务器的应答,而是可以继续发送后面的命令。在命令发送完毕后,再一次性的读取之前所有命令的应答。这样便节省了同步方式中RTT的开销。
    最后需要说明的是,如果Redis服务器发现客户端的请求是基于管线的,那么服务器端在接受到请求并处理之后,会将每条命令的应答数据存入队列,之后再发送到客户端。
   
三、Benchmark:

    以下是来自Redis官网的测试用例和测试结果。需要说明的是,该测试是基于loopback(127.0.0.1)的,因此RTT所占用的时间相对较少,如果是基于实际网络接口,那么管线机制所带来的性能提升就更为显著了。

复制代码 代码如下:

require 'rubygems'
    require 'redis'
   
    def bench(descr)
        start = Time.now
        yield
        puts "#{descr} #{Time.now-start} seconds"
    end
   
    def without_pipelining
        r = Redis.new
        10000.times {
            r.ping
        }
    end
   
    def with_pipelining
        r = Redis.new
        r.pipelined {
            10000.times {
                r.ping
            }
        }
    end
   
    bench("without pipelining") {
        without_pipelining
    }
    bench("with pipelining") {
        with_pipelining
    }
    //without pipelining 1.185238 seconds
    //with pipelining 0.250783 seconds

相关文章

  • Redis持久化RDB和AOF区别详解

    Redis持久化RDB和AOF区别详解

    这篇文章主要介绍了Redis持久化RDB和AOF区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Redis的BitMap使用操作命令

    Redis的BitMap使用操作命令

    Redis 为我们提供了位图这一数据结构,每个用户每天的登录记录只占据一位,365天就是365位,仅仅需要46字节就可存储,极大地节约了存储空间,这篇文章主要介绍了Redis的BitMap使用操作命令,需要的朋友可以参考下
    2023-10-10
  • k8s部署redis哨兵的实现

    k8s部署redis哨兵的实现

    本文主要介绍了k8s部署redis哨兵的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 详解Redis命令和键_动力节点Java学院整理

    详解Redis命令和键_动力节点Java学院整理

    Redis命令用于在redis服务器上执行某些操作,下面通过本文给大家分享Redis命令和键,需要的的朋友参考下吧
    2017-08-08
  • redis sentinel监控高可用集群实现的配置步骤

    redis sentinel监控高可用集群实现的配置步骤

    这篇文章主要介绍了redis sentinel监控高可用集群实现的配置步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Redis教程(二):String数据类型

    Redis教程(二):String数据类型

    这篇文章主要介绍了Redis教程(二):String数据类型,本文讲解了String数据类型概述、相关命令列表、命令使用示例三部分内容,需要的朋友可以参考下
    2015-04-04
  • Redis 数据库忘记密码找回或重置的解决方法

    Redis 数据库忘记密码找回或重置的解决方法

    对于 Redis 数据库,如果忘记了密码,可以通过密码重置来找回密码,今天通过本文给大家分享Redis 数据库忘记密码找回或重置的解决方法,感兴趣的朋友一起看看吧
    2024-01-01
  • 一次关于Redis内存诡异增长的排查过程实战记录

    一次关于Redis内存诡异增长的排查过程实战记录

    这篇文章主要给大家分享了一次关于Redis内存诡异增长的排查过程实战记录,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 浅谈我是如何用redis做实时订阅推送的

    浅谈我是如何用redis做实时订阅推送的

    这篇文章主要介绍了浅谈我是如何用redis做实时订阅推送的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • NoSQL和Redis简介及Redis在Windows下的安装和使用教程

    NoSQL和Redis简介及Redis在Windows下的安装和使用教程

    这篇文章主要介绍了NoSQL和Redis简介及Redis在Windows下的安装和使用教程,本文同时讲解了python操作redis,并给出了操作实例,需要的朋友可以参考下
    2015-01-01

最新评论