我有一个被多次调用的控制器(每分钟数千个),我需要记录每次调用而不会失去响应速度。
我有一段代码如下:
$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列表中是否存在密钥。
答案 0 :(得分:0)
如果需要检查密钥存在,我建议使用哈希而不是列表。 列表用于添加许多项目并按输入顺序排序,而不是按键排序 哈希是按键,并具有方法hexist