筛选Redis哈希项-从哈希或集合中删除项

筛选Redis哈希项-从哈希或集合中删除项,redis,Redis,我想做一个系统,将重定向http客户端取决于他们的源站点和国家。 为了决定将它们重定向到哪里,我有一个规则列表。一条规则可以如下所示: "id": 1, "sourceSites": [ 1, 2, 3, 4 ], "countries": [ "US", "UK", "DE" ], "amount": 1000, "url": "http://www.buyer2-url1.com" 这样的规则

我想做一个系统,将重定向http客户端取决于他们的源站点和国家。 为了决定将它们重定向到哪里,我有一个规则列表。一条规则可以如下所示:

"id":               1,
"sourceSites":      [ 1, 2, 3, 4 ],
"countries":        [ "US", "UK", "DE" ],
"amount":           1000,
"url":              "http://www.buyer2-url1.com"
这样的规则可能有几百条

要存储我计划使用的每个规则,请使用Redis哈希: 规则:金额url

当访问者进入系统时,我希望按sourceSite和访问者的国家/地区过滤规则。 为了实现一个过滤器,我计划使用Redis集合创建源站点和国家的索引:

sourceSite:<sourceSiteID> rule:<id1> rule:<id2> ...
country:<countryCode> rule:<id1> rule:<id2> ...
我不明白的是,当我需要删除一条规则时(例如,当流量超过该规则所需的流量时),我应该怎么做

我是否应该重新创建我的所有集合以创建源站点和国家/地区的新索引?但是如果一个访问者在索引还没有准备好的时候来了呢


或者我需要为每个规则存储另外两个集合,包括源站点列表和国家列表,这样我就可以找到所有索引集合并从中删除一个规则?

我可能会实现第二个选项,并通过使用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
删除规则将是:

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就可以应用内存优化。此外,考虑使用流水线来减少所需的往返行程的数量。