redis管道命令pipeline的使用
Posted autofelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis管道命令pipeline的使用相关的知识,希望对你有一定的参考价值。
〝 古人学问遗无力,少壮功夫老始成 〞
redis管道命令pipeline的使用,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。
目录
一、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的使用的主要内容,如果未能解决你的问题,请参考以下文章