1

Redisであいまい検索をしたい

維持するドメイン IP 情報がたくさんあり、それらを保持するためにハッシュを使用したい

Domain-IP の構造は次のようになります。

ドメイン IP

ドメイン

IP

last-access (最後にこの IP を使用してドメインにアクセスしたとき)

アクセス数

...

今、私は2つのことをしたいです:

  1. 次のように、この Domain-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. 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 + "アクセス数" + newAccessCount;

「HSET ドメイン ip。」+ domainStr + "." + ipStr + "最終アクセス" + newLastAccess;

私の質問は:

  1. ループはパフォーマンスの問題を引き起こしますか?

  2. ハッシュファイルを1つずつ更新する権利はありますか?

Redis、Thx :D で私が望む操作を完了するための良いアイデアを提供していただければ幸いです。

4

1 に答える 1

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>形式のクエリです。ハッシュ キーを追加および削除するときは、これらのインデックスを維持する必要があります。

于 2013-10-24T20:47:17.493 に答える