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

标签 redis

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

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

这样的规则可能有数百条。

为了存储每条规则,我打算使用 Redis 哈希: rule: 金额url

当访问者进入系统时,我想按 sourceSite 和访问者所在的国家/地区过滤规则。 为了实现过滤器,我计划使用 Redis Sets 创建 sourceSites 和国家的索引:

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

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

SINTER sourceSite:5 country:UK

我不明白的是,当我需要删除规则时(例如,当流量超过规则所需的数量时),我该怎么办?

我是否应该重新创建我所有的集合来创建一个新的 sourceSites 和国家索引?但是,如果访问者在索引尚未准备就绪时来了怎么办?

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

最佳答案

我可能会实现第二个选项并通过使用 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 就可以应用内存优化。此外,考虑使用流水线来减少所需的往返次数。

关于redis - 过滤 Redis 哈希条目 - 从哈希或集合中删除条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442279/

相关文章:

redis - 如何在 DC/OS 中创建 Redis 集群

java - 用Java实现一致性哈希算法

python - 将字符串列表转换为单个模式

magento - Redis 关闭了我的 Magento 网站

ruby-on-rails - Sidekiq 作业已安排,未运行,只是消失了

node.js - Redis:按分数排序的集合的交集

data-structures - 我将如何在 Redis 中构建这些数据?

c - C中结构属性的 "dot"定义是什么

Redis Sentinel master 没有立即降级为 slave

ruby-on-rails - Rails eventmachine 未初始化 evma_install_oneshot_timer