我想在Redis中进行模糊搜索
我有很多要维护的域IP信息,我想使用哈希来保存它们
Domain-IP的结构是这样的:
域-IP
域
IP
last-access(我上次使用此ip访问域名)
访问计数
...
现在我想做两件事:
按域搜索此域名 - IP信息,例如:select * from domain-ip where domain =“www.google.com”
按域和IP更新域IP信息,例如:update 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的搜索信息:
for (string key : keys) { execute("HGETALL " + key) // then convert the hash into a POJO }
和更新操作如下:
“HSET domainip。” + domainStr +“。” + ipStr +“access-count”+ newAccessCount;
“HSET domainip。” + domainStr +“。” + ipStr +“last-access”+ newLastAccess;
我的问题是:
循环是否会导致性能问题?
是否有权逐一更新哈希字段?
如果你能提供一个好主意来完成我想要的操作Redis,那将是很好的,Thx:D
答案 0 :(得分: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>
格式的查询。在添加和删除哈希键时,您需要维护这些索引。