我有一个被调用很多次(每分钟数千次(的控制器,我需要在不损失响应速度的情况下记录每次调用。
我有一段代码如下:
$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
(。
我尝试用PHP_INT_MAX
替换$len
,但问题仍然存在。我也尝试在最后添加$pipe->exec();
,但它也没有帮助。
如果我用 $redis->lRange
替换$pipe->lRange
,一切都开始工作,但速度非常慢,因为每个 redis 调用都在等待响应。
我该如何解决这种情况?
UPD:我发现$list
$pipe
返回对象Redis
而不是数组。所以问题是,如何在不检索列表本身的情况下检查 Redis 列表中是否存在密钥。
如果需要检查密钥是否存在,我建议使用哈希而不是列表。列表用于添加许多项目并按输入顺序排序,而不是按键排序哈希是按键的,并且具有方法 hexists