Redis批量执行(如list批量添加)命令工具 —— pipeline管道应用

前言

  1. Redis使用的是客户端-服务器(CS)模型和请求/响应协议的TCP服务器。这意味着通常情况下一个请求会遵循以下步骤:

    使用Redis管道提升性能

    (1)客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
    (2)服务端处理命令,并将结果返回给客户端。

  2. 客户端和服务端通过网络进行连接。这样的连接可能非常快(在一个回路网络中),也可能非常慢(在广域网上经过多个结点才能互通的两个主机)。
  3. 但是无论是否存在网络延迟,数据包从客户端传输到服务端,以及客户端从服务端获得响应都需要花费一些时间。这段时间就称为往返时延(Round Trip Time)。
  4. 因此当客户端需要执行一串请求的时候,很容易看出它对性能的影响(例如往同一个队列中加入大量元素,或者往数据库中插入大量的键)。如果RTT时长为250毫秒(在基于广域网的低速连接环境下),即使服务器每秒可以处理10万个请求,但是实际上我们依然只能每秒处理最多4个请求。
  5. 如果处于一个回路网络中,RTT时长则相当短(我的主机ping 127.0.0.1时只需要0.063ms),但是如果你执行一大串写入请求的时候,还是会有点长。
  6. 如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,由redis服务器依次执行,并返回结果。
  7. 为了解决此类问题,设计者设计出了redis管道命令:客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复返回给客户端,从而大大增加了协议性能。

pipeline在php中的应用

  1. 管道的开启方式最主要是一条命令:$redis->pipeline()
  2. 批量给一个list类型的key添加10w条数据,实例如下:

    
    <?php
       $redis = new Redis();
       $redis->connect('127.0.0.1', 6379);
       $redis->auth('******');
       $redis->select(0);
       $redis->pipeline();//开启管道
       
       //假设变量$data数组有10w条数据,批量添加到list类型中
       $data = array(1,2,3,...,100000);
       $key = 'list1';
       foreach($data as $value){
           $redis->rpush($key,$value);
       }
    

原文地址:https://segmentfault.com/a/1190000016889789

posted @ 2018-11-15 15:44  sfornt  阅读(4643)  评论(0编辑  收藏  举报