从redis中的通配符键获取/求和值

从redis中的通配符键获取/求和值,redis,nosql-aggregation,nosql,Redis,Nosql Aggregation,Nosql,我在redis中有一个字符串类型的键值存储,有这样的键-- 我可以使用如下通配符查询来检索/url pattern/的所有密钥-- 我想检索与此通配符对应的所有键的值 我试过这个 mget /url-pattern/* 1) (nil) 但是它没有像预期的那样返回数组 如何检索与/url pattern/* 我还想对值进行求和,但我认为redis中没有所谓的sum()命令,redis中没有可以从通配符键返回值的命令 如果您看到KEYScommand:的文档,它会说 将键视为只应在生产中

我在redis中有一个字符串类型的键值存储,有这样的键--

我可以使用如下通配符查询来检索/url pattern/的所有密钥--

我想检索与此通配符对应的所有键的值

我试过这个

    mget /url-pattern/*
1) (nil)
但是它没有像预期的那样返回数组

如何检索与/url pattern/*


我还想对值进行求和,但我认为redis中没有所谓的sum()命令,redis中没有可以从通配符键返回值的命令

如果您看到
KEYS
command:的文档,它会说

将键视为只应在生产中使用的命令 非常小心的环境。它可能会破坏性能时,它是 针对大型数据库执行。此命令用于 调试和特殊操作。不要在日常生活中使用钥匙 应用程序代码


我不知道您的业务用例,但看起来您可能需要使用不同的数据结构来满足此需求。您可以使用list或set来存储类似的url模式。

MGET接受多个参数,其中每个参数都有一个键名。它不支持键名模式


您可以首先获取所有相关的键名(不要使用键,而是使用扫描),然后使用MGET获取它们的值。

以下是2015年的更新答案

如果您可以将Redis升级到2.8以上,则带有MATCH的SCAN命令将适用于此。在该版本之前,不需要太多,除非在开发环境中,否则不要使用KEYS命令

命令行上的示例:

$ redis-cli
127.0.0.1:6379> scan match V3.0:*
(error) ERR invalid cursor
127.0.0.1:6379> scan 0 match V3.0:*
1) "0"
2) 1) "V3.0:UNITTEST55660BC7E0C5B"
   2) "V3.0:shop.domain.com:route"
   3) "V3.0:UNITTEST55660BC4A2548"
127.0.0.1:6379> scan 0 match V1.0:*
1) "0"
2) (empty list or set)
127.0.0.1:6379> scan 0 match V3.0:*
1) "0"
2) 1) "V3.0:UNITTEST55660BC7E0C5B"
   2) "V3.0:shop.domain.com:route"
   3) "V3.0:UNITTEST55660BC4A2548"
PHP中的示例:

// Initialize our iterator to NULL
$iterate = null;

// retry when we get no keys back
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);

while ($arr_keys = $redis->scan($iterate, 'match:*')) {
    foreach ($arr_keys as $str_key) {
        echo "Here is a key: $str_key\n";
    }
    echo "No more keys to scan!\n";
}
注意,php代码没有经过测试,例如本文的核心文档。生产代码需要根据需要查找的键进行修改

对于Ubuntu上的用户,以下是升级php5 redis的说明:

  • 在此处下载2.2.7软件包:
  • $php-i | grep Redis
    Redis支持=>已启用
    Redis版本=>2.2.4
  • 按照自述文件中的说明进行phpize、配置和安装
  • 为命令行cli包创建符号链接:
    cd/etc/php5/cli/conf.d&&sudo ln-s.././mods available/redis.ini 20 redis.ini
  • $php-i | grep Redis
    Redis支持=>已启用
    Redis版本=>2.2.7

  • 从v2.8开始,使用SCAN命令(等)而不是KEYS-它可以让您获得与KEYS几乎相同的结果,但使用礼貌的、非阻塞的方式。在我们运行类似的操作一段时间后,需要额外注意。请记住,扫描仍然会循环通过键,因此这可能会对性能产生影响。
    $ redis-cli
    127.0.0.1:6379> scan match V3.0:*
    (error) ERR invalid cursor
    127.0.0.1:6379> scan 0 match V3.0:*
    1) "0"
    2) 1) "V3.0:UNITTEST55660BC7E0C5B"
       2) "V3.0:shop.domain.com:route"
       3) "V3.0:UNITTEST55660BC4A2548"
    127.0.0.1:6379> scan 0 match V1.0:*
    1) "0"
    2) (empty list or set)
    127.0.0.1:6379> scan 0 match V3.0:*
    1) "0"
    2) 1) "V3.0:UNITTEST55660BC7E0C5B"
       2) "V3.0:shop.domain.com:route"
       3) "V3.0:UNITTEST55660BC4A2548"
    
    // Initialize our iterator to NULL
    $iterate = null;
    
    // retry when we get no keys back
    $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
    
    while ($arr_keys = $redis->scan($iterate, 'match:*')) {
        foreach ($arr_keys as $str_key) {
            echo "Here is a key: $str_key\n";
        }
        echo "No more keys to scan!\n";
    }