huangxuegang

你要悄悄学php,然后惊艳所有人
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

redis中的管道

Posted on 2020-07-30 11:07  一花多叶无菩提  阅读(197)  评论(0)    收藏  举报

正常redis的执行流程

1.客户端向服务器端发出请求,监听socket返回,通常是阻塞模式,等待服务器响应
2.服务端处理命令,并将结果返回给客户端

正常redis执行造成的问题

1.客户端和服务器通过网络进行连接。这个连接可以很快(loopback接口)或很慢(建立了一个多次跳转的网络连接)。无论网络延如何延时,数据包总是能从客户端到达服务器,并从服务器返回数据回复客户端。
2.这个时间被称之为 RTT (Round Trip Time - 往返时间). 当客户端需要在一个批处理中执行多次请求时很容易看到很容易影响性能的
3.如果采用loopback接口,RTT就短得多(比如我的主机ping 127.0.0.1只需要44毫秒),但它任然是一笔很多的开销在一次批量写入操作中。

管道可以解决上述问题

一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。

php执行代码

<?php 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//把操作当成一个事务执行
$pipe = $redis->multi(Redis::PIPELINE);
for ($i = 0; $i < 3; $i++) {
    $key = "key::{$i}";
    //用0来填充字符串右侧str_pad填充字符串到右侧
    print_r($pipe->set($key, str_pad($i, 2, '0', 0)));
    echo PHP_EOL;
    print_r($pipe->get($key));
    echo PHP_EOL;
}
$result = $pipe->exec();
print_r($result);

结果