2

我在 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()

4

3 回答 3

3

MGET 接受多个参数,每个参数都有一个键名。它不做键名模式。

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

于 2014-09-01T11:47:28.847 回答
3

这是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、配置、安装
  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
于 2015-05-27T19:10:29.490 回答
0

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

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

将 KEYS 视为仅应极其小心地在生产环境中使用的命令。当它针对大型数据库执行时,它可能会破坏性能。该命令用于调试和特殊操作。不要在常规应用程序代码中使用 KEYS。

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

于 2014-09-01T11:30:43.933 回答