【发布时间】:2018-06-20 14:23:34
【问题描述】:
我有一个被多次调用(每分钟数千次)的控制器,我需要在不丢失响应速度的情况下记录每个调用。
我有一段代码如下:
$redis = Redis::connection();
$redis->pipeline(function($pipe) use ($type, $redis)
{
// usual
$pipe->incr($type);
// check unique list
$len = $pipe->lLen($type.'_unique_list');
$list = $pipe->lRange($type.'_unique_list', 0, $len);
if(!in_array($this->uid, $list)) {
$pipe->rPush($type . '_unique_list', $this->uid);
$pipe->incr($type . '_unique');
}
});
在另一个地方,我从 Redis 获取数据并显示它们。
问题是,当我使用$pipe->lLen 和$pipe->lRange 时,数字不会改变(有趣的是$type 和$type . '_unique' change 都没有)。
我尝试将$len 替换为PHP_INT_MAX,但问题仍然存在。我也试过最后添加$pipe->exec();,但也没有用。
如果我将 $pipe->lRange 替换为 $redis->lRange,一切都会开始工作,但速度非常慢,因为每个 redis 调用都在等待响应。
我该如何解决这种情况?
UPD:我发现 $list 与 $pipe 一起返回 Redis 对象,而不是数组。所以问题是,如何在不检索列表本身的情况下检查密钥是否存在于 Redis 列表中。
【问题讨论】: