1

ソース サイトと国に応じて http クライアントをリダイレクトするシステムを作成したいと考えています。それらをどこにリダイレクトするかを決定するために、ルールのリストがあります。1 つのルールは次のようになります。

"id":               1,
"sourceSites":      [ 1, 2, 3, 4 ],
"countries":        [ "US", "UK", "DE" ],
"amount":           1000,
"url":              "http://www.buyer2-url1.com"

そのようなルールは数百ある場合があります。

各ルールを保存するには、Redis ハッシュ: ルール: 金額 URL を使用する予定です

訪問者がシステムに来たときに、sourceSite と訪問者の国でルールをフィルタリングしたいと考えています。フィルターを実装するには、Redis セットを使用して sourceSites と国のインデックスを作成する予定です。

sourceSite:<sourceSiteID> rule:<id1> rule:<id2> ...
country:<countryCode> rule:<id1> rule:<id2> ...

country=UK と sourceSiteID=5 からの訪問者がいる場合、2 つのセットを交差させるだけです。

SINTER sourceSite:5 country:UK

理解できないのは、ルールを削除する必要がある場合 (たとえば、トラフィックの量がルールに必要な量を超えた場合) はどうすればよいですか?

すべてのセットを再作成して、sourceSites と国の新しいインデックスを作成する必要がありますか? しかし、インデックスがまだ準備できていないときに訪問者が来た場合はどうなるでしょうか?

または、sourceSites のリストと国のリストを含むルールごとにさらに 2 つのセットを保存する必要があるので、インデックスのすべてのセットを見つけて、それらからルールを削除できますか?

4

1 に答える 1

0

私はおそらく2番目のオプションを実装し、Redisトランザクションを使用して一貫性を保証します。

ルールを追加すると、次のようになります。

MULTI
HMSET rule:1 id 1 amount 1000 url http://www.buyer2-url1.com
SADD rule:1:sourceSites 1 2 3 4
SADD rule:1:countries US UK DE
SADD sourceSite:1 1
SADD sourceSite:2 1
SADD sourceSite:3 1
SADD sourceSite:4 1
SADD country:US 1
SADD country:UK 1
SADD country:DE 1
EXEC

ルールを削除すると、次のようになります。

WATCH rule:1
HGETALL rule:1
SMEMBERS rule:1:sourceSites
SMEMBERS rule:1:countries
MULTI
... sanity check depending on the content of the rule ...
For all source sites S (in rule:1:sourceSites):
   SREM sourceSite:S 1
For all country codes C (in rule:1:countries):
   SREM country:C 1
DEL rule:1:countries
DEL rule:1:sourceSites
DEL rule:1
EXEC

Redisがメモリ最適化を適用できるように、セットでは整数のみを使用することをお勧めします(ルールでプレフィックスを付けないでください:)。また、必要なラウンドトリップの数を減らすためにパイプラインを使用することを検討してください。

于 2012-11-19T10:52:17.650 に答える