2013-10-24 28 views
1

做了模糊搜索我想要做的模糊搜索,在Redis的如何在Redis的

我有很多的域名,IP信息維護,我想用一個哈希追究他們

的域的IP的結構是某事像這樣:

域的IP

IP

最後訪問(我最後一次使用此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」

所以我的設計在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. GET所有的鑰匙都以www.g開頭oogle.com方式:按鍵domainip.www.google.com *
  2. 使用這些按鍵來獲得所有關於谷歌的信息在一個循環:
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 +「最後訪問」+ newLastAccess;

我的問題是:

  1. 是否循環會導致性能問題?

  2. 是否有權逐一更新散列?

這將是很好,如果你可以提供一個不錯的主意來完成我想要的Redis的操作,THX: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>。在添加和刪除散列鍵時,您需要維護這些索引。