2012-11-18 84 views
1

我想製作一個系統,根據它們的源站點和國家來重定向http客戶端。 要決定在哪裏重定向他們,我有一個規則列表。一條規則可以是這樣的:過濾Redis哈希條目 - 從哈希或從集合中刪除條目

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

可以有幾百個這樣的規則。

要存儲的每個規則我打算使用Redis的哈希值: 規則:量網址

當訪問者進來到我要篩選由sourceSite和訪問者的國家規則體系。 要實現一個過濾器,我打算創建一個使用Redis的sourceSites和國家的指數設置:

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

當我有從國家=英國和sourceSiteID = 5我只是讓兩個集合交集訪問者:

SINTER sourceSite:5 country:UK 

我不明白的是當我需要刪除一條規則(例如,當流量超過規則所需的數量)時該怎麼辦?

我應該重新創建我的所有套件以創建SourceSites和國家的新索引嗎?但是如果訪問者在索引還沒有準備好時就會發生什麼呢?

或者我需要爲sourceSites和國家列表的每個規則存儲另外兩組,所以我可以找到索引的所有集合並從它們中刪除規則?

回答

0

我可能會實現第二個選項,並通過使用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可以應用內存優化。另外,請考慮使用流水線來減少所需往返次數。