Redis 缓存架构
为了应对高并发的设备请求,规则引擎设计了多级 Redis 缓存结构,尽量减少数据库查询。
1. 缓存更新流程 (规则引擎)
以下是规则引擎缓存更新的流程图:
2.1 缓存 Key 设计规范 (规则引擎)
规则引擎的Redis Key设计遵循以下规范。
缓存中的所有mac需要去掉冒号? redis key中遇到b c r等关键字,是bid,cid,rid的简写,btype是业务类型简写。
| 缓存维度 | Redis Key | Value 结构 | 说明 |
|---|---|---|---|
| MAC -> 规则ID | r:m:r:{mac} | Set<RuleID> | 该MAC地址直接关联的规则ID集合 |
| 渠道ID -> 规则ID | r:c:r:{channel_id} | Set<RuleID> | 该渠道下绑定的规则ID集合 |
| 无设备限制-->规则ID | r:no:limit:r | Set<RuleID> | 未配置任何渠道或者mac的规则ID集合 |
r:c:btype:r:{channel_id} | Key: {business_type}Value: Set<RuleID> | ||
| 业务类型 -> 规则ID | r:btype:r:{business_type} | Set<RuleID> | 该业务类型下的所有通用规则ID集合 |
| 规则ID+业务类型 -> 业务ID | r:r:btype:b:{rule_id} | Hash Key: {business_type}Value: Set<BusinessID> | 规则匹配成功后,反查其对应的业务ID集合 |
| 规则ID->规则详情 | data:base:rule:{rule_id} | String (JSON) | 规则的完整实体信息,需要包含地区ID集合。 |
| 业务类型->业务ID->剩余数量限制信息 | r:btype:b:limit:{business_type} | Hash Key: {business_id}Value: {limit_count,current_count} | 剩余数量限制信息,该缓存在开始的时候可能会出现大量变化,所以更新不能用删除缓存这种操作 |
2.2 缓存更新机制 (规则引擎)
系统通过监听数据变更事件来实时更新缓存:
- MAC关联变更: 当
rule_mac_resource_item(MAC资源关联MAC表) 或rule_mac_item(规则关联MAC表) 变动时,更新r:m:r:{mac}(MAC -> 规则ID)。 - 渠道关联变更: 当
rule_channel_item(规则关联渠道表) 变动时,更新r:c:r:{channel_id}(渠道ID -> 规则ID) 。 - 规则属性变更: 当
rule_liteflow_chain(规则定义表) 或rule_region_item(规则关联地区表)变动时,更新data:base:rule:{rule_id}(规则ID->规则详情)。 - 业务绑定变更: 当
rule_business(规则关联业务表) 变动时,级联更新相关维度的缓存~~,r:c:btype:r:{channel_id}(渠道ID+业务ID -> 规则ID)~~r:btype:r:{business_type}(业务类型 -> 规则ID)r:r:btype:b:{rule_id}(规则ID+业务类型 -> 业务ID) 。 - 数据删除: 删除规则时,删除
data:base:rule:{rule_id}(规则ID->规则详情)r:r:btype:b:{rule_id}(规则ID+业务类型 -> 业务ID)。更新操作可选,等缓存自行过期也行,涉及可以更新的缓存,。r:c:r:{channel_id}(渠道ID -> 规则ID)r:c:btype:r:{channel_id}(渠道ID+业务ID -> 规则ID) - 特殊场景:当某条规则在编辑完成后不再有关联的mac与渠道时,或者从无关联mac与渠道变为有关联时,更新
r:no:limit:r(无设备限制-->规则ID)。 - 数量限制变更:当数量限制变化时,更新
r:btype:b:limit:{business_type}(业务类型->业务ID->剩余数量限制信息),这个变化是由业务系统触发,规则这边不提供配置和查询页面,current_count变化采用mq解耦发送。