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