网上一大堆文章都在说pipeline怎么提升性能,我只是想知道安装好phpredis库之后,代码上如何写来开启管道模式,也就是下面这一小撮代码而已。
$pipe = $redis->multi(Redis::PIPELINE); //开启管道
$pipe->exec();
//提交管道里操作命令
就只看到google上一篇文章提到这个,虽然简单,但真是感觉大象遇上了蚂蚁一样,问题虽小但要是不会,你也拿它没辙。
原文是英文,现翻译在此,分享给大家。
你是不是曾经遇到过这种情况:循环遍历一组数据,在每次循环里又要执行数据库增删改操作。
很明显,我们不应该用这种方式的,于是我们就采用了事务,或者是拿新增数据来说,将几笔插入记录组装成一次大的执行语句,一次插入一组记录。
上面说的是我们使用传统关系型数据库(RDBMS)时可选的方案,那假如我们使用的是redis呢,那该选什么方法。
在下面代码里,我用了一个用户名数组,数组元素的key值是用户对应的id,一旦用户修改了其用户名,我将修改两个redis值:
$redis = new Redis(); //开启管道模式,代表将操作命令暂时放在管道里 $pipe = $redis->multi(Redis::PIPELINE); //循环遍历数据,执行操作 foreach ($users as $user_id => $username) { //用户名修改次数+1 $pipe->incr('changes:' . $user_id); // 更新用户名 $pipe->set('user:' . $user_id . ':username', $username); } //开始执行管道里所有命令 $pipe->exec();
$redis = new Redis(); //开启管道模式 $pipe = $redis->multi(Redis::PIPELINE);
//循环遍历数据,执行操作
foreach ($users as $user_id => $username) { //用户被访问的次数+1 $pipe->incr('accessed:' . $user_id); // 获取用户数据记录 $pipe->get('user:' . $user_id); }
//
开始执行管道里所有命令
$users = $pipe->exec(); // 打印数据 print_r($users);
$pipe->discard();