我在redis中有一个字符串类型的键值存储,其中有这样的键——
/url-pattern/url-slug-1
/url-pattern/url-slug-2
/url-pattern/url-slug-3
/url-pattern/url-slug-4 ...
我可以使用这样的通配符查询检索/url模式/的所有密钥——
keys /url-pattern/*
我想检索与此通配符/url模式/*对应的所有键的值
我试过这个
mget /url-pattern/*
1) (nil)
但它没有按预期返回数组。
如何检索/url模式/*对应的所有密钥的值
我也想对这些值求和,但我认为在redis 中没有这样的东西叫做sum()
MGET接受多个参数,每个参数都有一个键名。它不执行关键字名称模式。
您可以做的是首先获取所有相关的密钥名称(不要使用KEYS,而是使用SCAN),然后使用MGET获取它们的值。
以下是2015年的最新答案。
如果您可以将Redis升级到2.8以上,则SCAN命令和MATCH将适用于此。在那个版本之前,没有那么多,除非在开发环境中,否则不要使用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_keyn";
}
echo "No more keys to scan!n";
}
注意,php代码没有经过测试,例如这里的核心文档。生产代码需要根据需要查找的密钥进行修改。
对于那些在Ubuntu上的人,以下是升级php5-redis:的说明
- 在此处下载2.2.7软件包:http://pecl.php.net/package/redis
$ php -i | grep Redis Redis Support => enabled Redis Version => 2.2.4
- 按照README中的说明进行phpize、configure、make install
- 为命令行cli包创建符号链接:
cd /etc/php5/cli/conf.d && sudo ln -s ../../mods-available/redis.ini 20-redis.ini
$ php -i | grep Redis Redis Support => enabled Redis Version => 2.2.7
REDIS中没有可以从通配符键返回值的命令。
如果您看到KEYS
命令的文档:http://redis.io/commands/keys,上面写着
将KEYS视为只应在生产中使用的命令非常小心的环境。它可能会破坏性能针对大型数据库执行。此命令用于调试和特殊操作。不要在常规中使用KEYS应用程序代码。
我不知道你的业务用例,但看起来你可能需要使用不同的数据结构来满足这个需求。您可以使用列表或设置来存储类似的url模式。