如何在Redis中进行模糊搜索

时间:2013-10-24 16:47:53

标签: redis

我想在Redis中进行模糊搜索

我有很多要维护的域IP信息,我想使用哈希来保存它们

Domain-IP的结构是这样的:

域-IP

  

     

IP

     

last-access(我上次使用此ip访问域名)

     

访问计数

     

...

现在我想做两件事:

  1. 按域搜索此域名 - IP信息,例如:select * from domain-ip where domain =“www.google.com”

  2. 按域和IP更新域IP信息,例如:update domain-ip set access-count = access-count + 1 where domain =“www.google.com”and ip =“192.168.1.1 “

  3. 所以我的设计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的搜索信息:

    1. 从www.google.com获取所有密钥:keys domainip.www.google.com *
    2. 使用这些密钥在循环中获取有关Google的所有信息:
    3. 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;

      我的问题是:

      1. 循环是否会导致性能问题?

      2. 是否有权逐一更新哈希字段?

      3. 如果你能提供一个好主意来完成我想要的操作Redis,那将是很好的,Thx:D

1 个答案:

答案 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>格式的查询。在添加和删除哈希键时,您需要维护这些索引。