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

繁星落眼眶 · · 29 次点击 · · 开始浏览    

前言

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

    (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);
       }

本文来自:Segmentfault

感谢作者:繁星落眼眶

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

29 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet