redis管道命令pipeline的使用

时间:2019-09-11作者:klpeng分类:IT综合浏览:1896评论:0

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

  • redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务

  • 因此无论是发出请求还是接收响应,都必须经过网络传输

  • 即客户端必须接收到服务端完整的响应,才能进行后续请求

  • 网络传输不可避免的会造成一定的延迟,特别是在跨机器远程访问redis的时候

  • 一条命令对应一次请求和响应的话,大量命令累计的延迟会显得很高

  • 所以诞生了redis管道命令

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

  • 由流程图可知,正常命令会一条命令对应一次请求响应

  • 如果数据量大,这将会花费大量的时间

  • 而管道命令,是将命令存储在redis客户端,然后通过管道统一执行,统一返回结果

  • redis管道通过减少客户端和服务器端的通信次数,减少的I/O的调用次数,来达到减少通信传输中往返时间的目的

redis管道命令pipeline的使用

 (正常命令)

redis管道命令pipeline的使用

(管道命令) 

三、注意事项 

  • 由于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
打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢