网上一大堆文章都在说pipeline怎么提升性能,我只是想知道安装好phpredis库之后,代码上如何写来开启管道模式,也就是下面这一小撮代码而已。
$pipe = $redis->multi(Redis::PIPELINE); //开启管道
$pipe->exec(); //提交管道里操作命令
就只看到google上一篇文章提到这个,虽然简单,但真是感觉大象遇上了蚂蚁一样,问题虽小但要是不会,你也拿它没辙。
原文是英文,现翻译在此,分享给大家。
你是不是曾经遇到过这种情况:循环遍历一组数据,在每次循环里又要执行数据库增删改操作。
很明显,我们不应该用这种方式的,于是我们就采用了事务,或者是拿新增数据来说,将几笔插入记录组装成一次大的执行语句,一次插入一组记录。
上面说的是我们使用传统关系型数据库(RDBMS)时可选的方案,那假如我们使用的是redis呢,那该选什么方法。
在下面代码里,我用了一个用户名数组,数组元素的key值是用户对应的id,一旦用户修改了其用户名,我将修改两个redis值:
当前用户其用户名修改次数需要+1
更新当前用户对应的用户名数据
$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();
管道里放什么操作,并没有什么限制,即使你放获取数据的操作也是ok的。
现在就假设我们要给某个redis key值+1,但是获取另一个redis key值的value数据。
如下代码就是一个操作是更新某个用户被访问的次数,另一个操作则是获取用户信息数据。
$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);
注意,由于管道里每一条命令都会返回数据,所以最终打印的数组,会含有incr操作带来的记录,还有从获取用户操作那里拉下来的redis key值作为了打印数组的索引值。
不过有个好处,管道里每个操作命令返回的数据是按照管道里顺序存储的,key值是0,1,2这种。我们想要啥数据,自己稍微处理一下就好啦。
如果我们像取消管道操作,用下面代码即可:
$pipe->discard();
原文链接:https://joshtronic.com/2014/06/08/how-to-pipeline-with-phpredis/
以上内容出处:http://www.zhai14.com/blog/88e5f960abda346b8738a68d46919a18.html