Redis通配符搜索和返回哈希值(%word)

时间:2016-02-03 10:20:12

标签: redis

我使用的是Redis 3.0.6

我尝试使用Redis创建自动完成功能。我把哈希,乐队名称,乐队名称和成立年份保留了三件事。

我想进行通配符搜索,以获取以某个字母开头的乐队名称及其附加功能,例如他们的排名和年份。

我该怎么做?是可以立即执行还是需要子查询来获取其属性?

HMSET 3doorsdown rank 7 year 2003
OK
127.0.0.1:6379> HMSET adele rank 1 year 2005
OK
127.0.0.1:6379> HMSET almora rank 3 year 1995
OK
127.0.0.1:6379> HMSET amiina rank 2 year 2009
OK
127.0.0.1:6379> HMSET anathema rank 4 year 1990
OK
127.0.0.1:6379> HMSET birdy rank 6 year 2012
OK
127.0.0.1:6379> HMSET blink182 rank 5 year 1999
OK

SCAN 0 match a* COUNT 1000会返回所有以a开头的记录,但不会返回他们的排名和年份。

1) "0"
2) 1) "adele"
   2) "almora"
   3) "anathema"
   4) "amiina"
127.0.0.1:6379>

https://stackoverflow.com/a/33625191/3210431

我没有使用过KEYS,因为它价格昂贵,但也有人说SCAN价格昂贵(上图)。

我该怎么办?我是否需要将名称保存在SET中,通过扫描进行匹配,如果匹配,我应该按照名称在HASHES中单独查找这些记录,如下所示?

1-)查找以SET

中的a开头的波段名称

2-)返回了4条记录

3-)通过HASHES中的HGETALL获取他们的功能

编辑:我有另一个想法。我将名字保存在SET中,使用ZRANGEBYLEX并在HASH中进行另一个查询以获取属性,但我不知道哪一个是正确的方法。

1 个答案:

答案 0 :(得分:1)

Antirez写了一篇你可能觉得有用的article about autocomplete,可以从中得到一些想法,但实质上是:

使用SCAN会很昂贵并且看到你在整个密钥集上进行迭代,因此排序集合将是更好的方法。您可以在套装上使用词典排序来为您完成大部分繁重的工作。缺点是你正在为速度交易记忆。获得匹配的密钥后,您可以执行HGETALL来获取匹配的记录。如果您担心往返时间,可以将这些全部合并到一个lua脚本中(我建议这样做)。