redis管道命令pipeline的使用

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis管道命令pipeline的使用相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

redis管道命令pipeline的使用,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。

目录

一、redis管道技术的诞生原因

二、正常命令和管道命令流程图

三、注意事项 

四、时间消耗对比


一、redis管道技术的诞生原因

  • redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务
  • 因此无论是发出请求还是接收响应,都必须经过网络传输
  • 即客户端必须接收到服务端完整的响应,才能进行后续请求
  • 网络传输不可避免的会造成一定的延迟,特别是在跨机器远程访问redis的时候
  • 一条命令对应一次请求和响应的话,大量命令累计的延迟会显得很高
  • 所以诞生了redis管道命令

二、正常命令和管道命令流程图

  • 由流程图可知,正常命令会一条命令对应一次请求响应
  • 如果数据量大,这将会花费大量的时间
  • 而管道命令,是将命令存储在redis客户端,然后通过管道统一执行,统一返回结果
  • redis管道通过减少客户端和服务器端的通信次数,减少的I/O的调用次数,来达到减少通信传输中往返时间的目的

 (正常命令)

(管道命令) 

三、注意事项 

  • 由于redis的管道要求服务器一次性的将请求返回,因此redis服务端只能将靠前命令处理的结果暂时缓存起来
  • 如果管道一次响应的数据量过多,可能会对redis服务器的内存造成较大的压力
  • 所以管道批量处理的命令数量并不是越多越好,需要结合实际需求
  • pipeline 不保证原子性,如果要求原子性的,不推荐使用 pipeline
  • pipeline 无法在中途立即查得数据的结果

四、时间消耗对比

  • 下面是自行封装的正常命令和管道命令插入10万条数据时间对比
  • 从结果看出仅插入10万条数据,时间相差近十倍
<?php
class AutofelixRedis
{
    private $predis;

    public function __construct()
    {
        $this->predis = new Redis();
        $this->predis->connect('127.0.0.1', 6379);
    }

    //正常插入十万条数据
    public function base_test()
    {
        $stime = microtime(true);

        for ($i = 0; $i < 100000; $i++) {
            $this->predis->set("test{$i}", "value{$i}");
        }

        $etime = microtime(true);

        echo '正常插入消耗时间:' . ($etime - $stime);
    }

    //管道方式插入十万条数据
    public function pipe_test()
    {
        $stime = microtime(true);

        $pipeline = $this->predis->pipeline();
        for ($i = 0; $i < 100000; $i++) {
            $pipeline->set("test{$i}", "value{$i}");
        }
        $pipeline->exec();

        $etime = microtime(true);

        echo '管道插入消耗时间:' . ($etime - $stime);
    }
}

(new AutofelixRedis())->base_test(); //正常插入消耗时间:1.9659998416901
(new AutofelixRedis())->pipe_test(); //管道插入消耗时间:0.2350001335144

以上是关于redis管道命令pipeline的使用的主要内容,如果未能解决你的问题,请参考以下文章

redis管道命令pipeline的使用

redis管道命令pipeline的使用

redis之管道——pipeline

redis使用管道pipeline提升批量操作性能(php演示)

Redis学习笔记7--Redis管道(pipeline)

Redis学习笔记4--Redis管道(pipeline)