如何在 Redis 中进行模糊搜索
Posted
技术标签:
【中文标题】如何在 Redis 中进行模糊搜索【英文标题】:How to do a fuzzy search in Redis 【发布时间】:2013-10-24 16:47:52 【问题描述】:我想在 Redis 中做一个模糊搜索
我有很多域 IP 信息要维护,我想使用哈希来保存它们
Domain-IP的结构是这样的:
域名-IP
域名
ip
last-access(上次我用这个ip访问域)
访问次数
...
现在我想做两件事:
按域搜索此 Domain-IP 信息,例如:select * from domain-ip where domain = "www.google.com"
按域和 IP 更新 Domain-IP 信息,例如:更新 domain-ip set access-count = access-count + 1 where domain = "www.google.com" and ip = "192.168.1.1 "
所以我设计 Redis 中的结构是:
HSET domainip.www.google.com.192.168.1.1 access-count 20
HSET domainip.www.google.com.192.168.1.2 access-count 20
所以我可以像这样按域搜索它们,例如,搜索有关 www.google.com 的信息:
-
通过以下方式获取所有以 www.google.com 开头的密钥:keys domainip.www.google.com*
使用这些键循环获取有关 google 的所有信息:
for (string key : keys) execute("HGETALL " + key) // then convert the hash into a POJO
更新操作如下:
“HSET 域ip。” + domainStr + "." + ipStr + "访问计数" + 新访问计数;
“HSET 域ip。” + domainStr + "." + ipStr + "最后一次访问" + 新的最后访问;
我的问题是:
循环是否会导致性能问题?
是否有权逐个更新hash文件?
如果你能提供一个好主意来完成我想要在 Redis 中完成的操作,那就太好了,谢谢:D
【问题讨论】:
【参考方案1】:不建议将密钥用于生产用途(请参阅http://redis.io/commands/keys)。我的第一直觉是,您实际上想要一个 SQL 数据库,Redis 不会像您描述的那样对数据进行任意切片。
如果您出于某种原因确实需要使用 redis,则需要维护一堆索引以供访问。基本上,您要使用的每个“where 子句”都将获得一个集合(或排序集合,如果您需要特定的排序),维护与该键匹配的哈希列表。因此,例如,如果您有哈希
domainip.www.google.com.192.168.1.1
domainip.www.google.com.192.168.1.2
domainip.www.yahoo.com.192.168.1.4
你会创建索引集:
by_domain:www.google.com => (
domainip.www.google.com.192.168.1.1,
domainip.www.google.com.192.168.1.2
)
by_domain:www.yahoo.com => (
domainip.www.yahoo.com.192.168.1.4
)
其中集合的值是哈希的键,集合的键是<column>:<value>
格式的查询。在添加和删除哈希键时,您需要维护这些索引。
【讨论】:
以上是关于如何在 Redis 中进行模糊搜索的主要内容,如果未能解决你的问题,请参考以下文章