过滤Redis哈希条目 - 从哈希或集合中删除条目

时间:2012-11-18 16:55:52

标签: redis

我想创建一个系统,根据源站点和国家/地区重定向http客户端。 为了决定将它们重定向到哪里,我有一个规则列表。一条规则可能如下所示:

"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> ...

当我有来自country = UK的访问者和来自sourceSiteID = 5的访问者时,我只是将两个集合交集:

SINTER sourceSite:5 country:UK

我不明白当我需要删除规则时应该怎么办(例如,当流量超过规则的必要金额时)?

我应该重新创建所有集合以创建sourceSites和国家/地区的新索引吗?但是如果访客在索引尚未准备就绪时会怎样呢?

或者我需要为每个规则存储另外两个包含sourceSites列表和国家/地区列表,因此我可以找到所有索引集并从中删除规则?

1 个答案:

答案 0 :(得分: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就可以应用内存优化。另外,请考虑使用流水线技术来减少所需的往返次数。