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

前言

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

    (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条数据,实例以下:redis

    <?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);
       }
相关文章
相关标签/搜索