上一篇:Mysql保存反斜杠莫名消失的问题(2019-06-23 17:04:07)
文章大纲

php redis pipeline怎么用

2019-06-23 20:53:38

网上一大堆文章都在说pipeline怎么提升性能,我只是想知道安装好phpredis库之后,代码上如何写来开启管道模式,也就是下面这一小撮代码而已。

$pipe = $redis->multi(Redis::PIPELINE);   //开启管道
$pipe->exec(); //提交管道里操作命令


就只看到google上一篇文章提到这个,虽然简单,但真是感觉大象遇上了蚂蚁一样,问题虽小但要是不会,你也拿它没辙。

原文是英文,现翻译在此,分享给大家。


你是不是曾经遇到过这种情况:循环遍历一组数据,在每次循环里又要执行数据库增删改操作。

很明显,我们不应该用这种方式的,于是我们就采用了事务,或者是拿新增数据来说,将几笔插入记录组装成一次大的执行语句,一次插入一组记录。


上面说的是我们使用传统关系型数据库(RDBMS)时可选的方案,那假如我们使用的是redis呢,那该选什么方法。

在下面代码里,我用了一个用户名数组,数组元素的key值是用户对应的id,一旦用户修改了其用户名,我将修改两个redis值:

  1. 当前用户其用户名修改次数需要+1
  2. 更新当前用户对应的用户名数据
$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();




上一篇:Mysql保存反斜杠莫名消失的问题(2019-06-23 17:04:07)
我要评论
评论列表