我在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()的东西
答案 0 :(得分:3)
MGET接受多个参数,每个参数都有一个键名。它没有关键名称模式。
您可以做的是首先获取所有相关的键名(不使用KEYS ,改为使用SCAN),然后使用MGET获取它们的值。
答案 1 :(得分:2)
以下是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的说明:
$ php -i | grep Redis
Redis Support => enabled
Redis Version => 2.2.4
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
答案 2 :(得分:0)
REDIS中没有可用命令从通配符键返回值。
如果您看到KEYS
命令的文档:http://redis.io/commands/keys,则说明
将KEYS视为仅应在生产中使用的命令 环境非常谨慎。它可能会破坏性能 针对大型数据库执行。此命令适用于 调试和特殊操作。不要在常规中使用KEYS 应用程序代码。
我不知道您的业务用例,但看起来您可能必须使用不同的数据结构来满足此要求。您可以使用list或set来存储类似的url模式。