PHP Redis管道lRange无法正常工作

时间:2018-01-11 09:46:48

标签: php redis pipeline

我有一个被多次调用的控制器(每分钟数千个),我需要记录每次调用而不会失去响应速度。

我有一段代码如下:

    $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列表中是否存在密钥。

1 个答案:

答案 0 :(得分:0)

如果需要检查密钥存在,我建议使用哈希而不是列表。 列表用于添加许多项目并按输入顺序排序,而不是按键排序 哈希是按键,并具有方法hexist