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

时间:2014-09-01 06:11:06

标签: redis nosql-aggregation nosql

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

/url-pattern/url-slug-1
/url-pattern/url-slug-2
/url-pattern/url-slug-3
/url-pattern/url-slug-4 ... 

我可以使用这样的通配符查询检索 / url-pattern / 的所有键 -

keys /url-pattern/*

我想检索与此通配符 / url-pattern / *

对应的所有键的值

我试过这个

    mget /url-pattern/*
1) (nil)

但它没有按预期返回数组。

如何检索与 / url-pattern / *

对应的所有键的值

我也想对值进行总结,但我认为在redis中没有名为SUM()的东西

3 个答案:

答案 0 :(得分:3)

MGET接受多个参数,每个参数都有一个键名。它没有关键名称模式。

您可以做的是首先获取所有相关的键名(不使用KEYS ,改为使用SCAN),然后使用MGET获取它们的值。

答案 1 :(得分:2)

以下是2015年的最新答案。

如果你可以将Redis升级到2.8以上,那么带有MATCH的SCAN命令将适用于此。在该版本之前,不要那么多,除开发环境外,不要使用KEYS命令。

http://redis.io/commands/scan

命令行示例:

$ 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的说明:

  1. 在此处下载2.2.7软件包:http://pecl.php.net/package/redis
  2. $ php -i | grep Redis Redis Support => enabled Redis Version => 2.2.4
  3. 按照README中的说明进行phpize,configure,make install
  4. 为命令行cli包创建符号链接:cd /etc/php5/cli/conf.d && sudo ln -s ../../mods-available/redis.ini 20-redis.ini
  5. $ php -i | grep Redis Redis Support => enabled Redis Version => 2.2.7

答案 2 :(得分:0)

REDIS中没有可用命令从通配符键返回值。

如果您看到KEYS命令的文档:http://redis.io/commands/keys,则说明

  

将KEYS视为仅应在生产中使用的命令   环境非常谨慎。它可能会破坏性能   针对大型数据库执行。此命令适用于   调试和特殊操作。不要在常规中使用KEYS   应用程序代码。

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