主页 > 知识库 > Redis教程(十三):管线详解

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

热门标签:铁路电话系统 呼叫中心市场需求 百度竞价排名 AI电销 地方门户网站 服务外包 网站排名优化 Linux服务器

一、请求应答协议和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教程(十四):内存优化介绍
  • Redis教程(十五):C语言连接操作代码实例
  • Redis的LRU机制介绍
  • Redis数据库的应用场景介绍
  • Redis的Python客户端redis-py安装使用说明文档
  • Redis list 类型学习笔记与总结
  • Redis中实现查找某个值的范围
  • Redis禁用命令、危险命令及规避方法
  • 简介Lua脚本与Redis数据库的结合使用
  • 从MySQL到Redis的简单数据库迁移方法
  • 在Node.js应用中读写Redis数据库的简单方法
  • Redis sort 排序命令详解
  • 图文介绍PHP添加Redis模块及连接
  • 详解Redis中的双链表结构
  • Redis中的动态字符串学习教程
  • 利用Redis实现SQL伸缩的方法

标签:兰州 铜川 湘潭 仙桃 衡水 黄山 湖南 崇左

巨人网络通讯声明:本文标题《Redis教程(十三):管线详解》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266