我有一个排序集,其中包含以下键名和值:
zrange bargraph:branch:1:category:2:product:4
1) "76"
2) "55"
3) "10"
4) "84"
Run Code Online (Sandbox Code Playgroud)
在redis中是否有一个机制,我可以使用通配符(也许是?)使用zrange来获得相同的值?换句话说,redis是否支持zrange bargraph:branch:1:category:2?如果没有,如果我只知道类别id(2)而不使用产品id(4)而不使用不同的排序集,我最好能获得所有值吗?
Lig*_*mer 12
这是2015年的最新答案.
如果你可以将Redis升级到2.8以上,那么带有MATCH的SCAN命令将适用于此.在该版本之前,并非如此,除了在开发环境中之外,不要使用KEYS命令.
命令行示例:
$ redis-cli
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"
Run Code Online (Sandbox Code Playgroud)
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";
}
Run Code Online (Sandbox Code Playgroud)
注意,php代码没有经过测试,例如来自核心文档.需要根据查找所需的密钥修改生产代码.
对于那些在Ubuntu上的人,这里有升级php5-redis的说明:
$ php -i | grep Redis
Redis Support => enabled
Redis Version => 2.2.4cd /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正如您所提到的,KEYS 效率低下,因为引擎对键执行线性扫描。不幸的是,没有您正在寻找的通配符解决方案
考虑为每个类别的产品密钥使用 SET:
SADD bargraph:branch:1:category:2 1 2 3 4
要获取所有设置的类别成员,请执行以下操作:
SMEMBERS bargraph:branch:1:category:2
如果您不关心分数总和,或者每个排序集有不同的项目,您可以对每个产品排序集进行并集,如下所示:
ZUNIONSTORE bargraph:branch:1:category:2:product:all 4 bargraph:branch:1:category:2:product1 bargraph:branch:1:category:2:product2 bargraph:branch:1:category:2:product3 bargraph:branch:1:category:2:product4
现在你可以zrange bargraph:branch:1:category:2:product:all
您可以对上述操作进行管道化以获得更好的性能
| 归档时间: |
|
| 查看次数: |
17496 次 |
| 最近记录: |