pipline
redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。pipline可以打包n条命令,一次性传输到服务端,然后再一次性按顺序返回命令的执行结果。
需要注意的是集群模式对于pipline不太友好,因为pipline要操作的key可能在不同的哈希槽上,此时就需要进行请求的转发,但是这是与pipline的思想相违背的,所以集群模式下不太支持使用pipline的操作。
如果你操作的是字符串类型那么可以用mset和mget,key越多,mset和mget相对于pipeline越快。
PHP使用
$users = [1, 2, 3, 4]; $predis = app('redis')->connection()->client(); $user_values = $predis->pipeline(function ($pipe) use ($users) { foreach ($users as $val) { $pipe->get('test' . $val); } }); dump($user_values);
结果:
————————————————
版权声明:本文为CSDN博主「msw、」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/minshiwang/article/details/104654004/
redis的批量操作命令pipeline(PHP实现)
redis执行一条命令有四个过程:发送命令、命令排队、命令执行、返回结果;整个过程是一个往返时间(RTT)。如果有n条命令,就会消耗n次RTT。Redis的客户端和服务端可能部署在不同的机器上。在两地的数据传输受网络速度的影响,消耗n次的RTT会增加网络成本,这个和Redis的高并发高吞吐特性背道而驰。
use Redis;
class RedisTest
{
const PORT = 6379;
/**
* redis对象
*/
public $redis = null;
public function __construct()
{
$this->redis = new Redis();
$this->redis->connect('127.0.0.1', self::PORT);
}
public function testPipeline()
{
$str_constant = get_class($this->redis) . '::PIPELINE';
if (!$str_constant) {
return 'pipeline no exit';
}
return $this->redis->pipeline()->publish('test', 'pipe-info')->exec();
}
}