【问题标题】:How to do a fuzzy search in Redis如何在 Redis 中进行模糊搜索
【发布时间】:2013-10-24 16:47:52
【问题描述】:

我想在 Redis 中做一个模糊搜索

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

Domain-IP的结构是这样的:

域名-IP

域名

ip

last-access(上次我用这个ip访问域)

访问次数

...

现在我想做两件事:

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

  2. 按域和 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 的信息:

  1. 通过以下方式获取所有以 www.google.com 开头的密钥:keys domainip.www.google.com*
  2. 使用这些键循环获取有关 google 的所有信息:
for (string key : keys) {
   execute("HGETALL " + key) // then convert the hash into a POJO
}

更新操作如下:

“HSET 域ip。” + domainStr + "." + ipStr + "访问计数" + 新访问计数;

“HSET 域ip。” + domainStr + "." + ipStr + "最后一次访问" + 新的最后访问;

我的问题是:

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

  2. 是否有权逐个更新hash文件?

如果你能提供一个好主意来完成我想要在 Redis 中完成的操作,那就太好了,谢谢:D

【问题讨论】:

    标签: redis


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

    【讨论】:

      猜你喜欢
      • 2022-10-17
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 2018-03-13
      • 2020-05-08
      • 2016-11-20
      相关资源
      最近更新 更多