【问题标题】:PHP Redis pipeline lRange not working correctlyPHP Redis 管道 lRange 无法正常工作
【发布时间】: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 列表中。

【问题讨论】:

    标签: php redis pipeline


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2017-10-29
      • 1970-01-01
      相关资源
      最近更新 更多