4

我有一个排序集,它具有以下键名和值:

zrange bargraph:branch:1:category:2:product:4
1) "76"
2) "55"
3) "10"
4) "84"

redis 中是否有一种机制,我可以在使用 zrange 时使用通配符(也许是?)来获得相同的值?换句话说,redis 是否支持 zrange bargraph:branch:1:category:2?如果不是,如果我只知道类别 id(2) 而不是产品 id(4) 而不使用不同的排序集,我怎样才能最好地获得所有值?

4

2 回答 2

14

这是2015年的更新答案。

如果您可以将 Redis 升级到 2.8 以上,带有 MATCH 的 SCAN 命令将适用于此。在那个版本之前,没有那么多,除了在开发环境中,不要使用 KEYS 命令。

http://redis.io/commands/scan

命令行示例:

$ 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"

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-27T18:54:53.653 回答
4

正如您所提到的,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

您将上述操作流水线以获得更好的性能

于 2013-03-31T15:01:31.270 回答