PHP Redis 管道 lRange 无法正常工作



我有一个被调用很多次(每分钟数千次(的控制器,我需要在不损失响应速度的情况下记录每次调用。

我有一段代码如下:

    $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

最新更新