【问题标题】:SCAN command performance with phpredis使用 phpredis 扫描命令性能
【发布时间】:2016-08-11 09:27:56
【问题描述】:

我正在使用 phpredis 将 KEYS 替换为 SCAN。

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$it = NULL;
while($arr_keys = $redis->scan($it, "mykey:*", 10000)) {
    foreach($arr_keys as $str_key) {
        echo "Here is a key: $str_key\n";
    }
}

根据redis documentation,我使用SCAN对搜索进行分页以避免使用KEYS的缺点。
但在实践中,使用上述代码的成本比仅使用单个 $redis->keys() 低 3 倍
所以我想知道是我做错了什么,还是我必须付出速度才能避免 KEYS 的威胁?

请注意,我的数据库中总共有 400K+ 键,以及 4 个 mykey:*

【问题讨论】:

    标签: redis phpredis


    【解决方案1】:

    由于在生产环境中使用keys是被禁止的,因为它在迭代全局空间键的同时阻塞了整个服务器,那么,这里没有讨论使用或不使用keys

    另一方面,如果你想加快速度,你应该使用 Redis 更进一步:你应该索引你的数据。

    我怀疑这些 400K 键不能归类为集合或排序集合,甚至是散列,因此当您需要 400K-keys-database 的特定子集时,您可以针对一组 1K 项,而不是 400K。

    Redis 是关于索引数据的。如果没有,您只是在使用它,就像一个简单的键值存储一样。

    【讨论】:

    • 确实,数据库不是我的,我也是 Redis 新手,你的回答给了我一个提示,我需要更深入地研究它以实现我的目标。非常感谢
    • @LoiDang 是的,这并不容易。顺便说一句,Redis 中的错误可能会付出沉重的代价。您确实需要一个量身定制的数据库才能有效地使用 Redis
    【解决方案2】:

    使用示例的注意事项:

    $it = NULL;
    while($arr_keys = $redis->scan($it, "mykey:*", 10000)) {
        foreach($arr_keys as $str_key) {
            echo "Here is a key: $str_key\n";
        }
    }
    

    如果扫描的 10000 个键中没有一个匹配,那么它会返回空数组,然后它会放弃,并且你没有得到你想要的所有键!我会建议做更多这样的事情:

    $it = null;
    do
    {
        $arr_keys = $redis->scan($it, $key, 10000);
        if (is_array($arr_keys) && !empty($arr_keys))
        {
            foreach ($arr_keys as $str_key)
            {
                echo "Here is a key: $str_key\n";
            }
        }
    } while ($arr_keys !== false);
    

    以及为什么要花这么长时间,400k+ 个键,10000 个,这是对 redis 的 40 个扫描请求,如果不在本地机器上,每 40 个 redis 查询的延迟就会增加您的速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-20
      • 2014-04-27
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 2020-10-02
      相关资源
      最近更新 更多