跳到主要内容

Redis缓存设计

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件围绕黑名单系统的Redis缓存设计,系统性阐述缓存键设计、数据结构选择、过期策略配置、分层策略(热/冷)、更新机制(写后读一致性、失效策略、批量更新优化)、监控指标与高可用部署方案。目标是帮助读者快速理解并落地高性能、可维护的Redis缓存体系。

项目结构

黑名单模块的Redis缓存实现主要集中在以下位置:

  • 黑名单常量与DAO:负责缓存键命名、Set结构的增删改、随机过期、延迟双删等
  • Redis工具与客户端:封装Redisson/RedisTemplate能力,提供Lua批处理、批量删除、Set原子编辑等
  • 缓存配置与管理:自定义CacheManager支持“cacheName#ttl”动态过期,本地Caffeine缓存
  • 监控与运维:Redis监控接口,采集info/dbSize/commandstats,便于性能分析

Mermaid Diagram Code:

graph TB
subgraph "黑名单模块"
DAO["AppBlacklistedRedisDAO<br/>缓存操作入口"]
DO["AppBlacklistedRedisDO<br/>缓存实体"]
CONST["LocalCacheConstants<br/>本地缓存键常量"]
end
subgraph "Redis工具层"
RC["RedisClient<br/>Lua批量/原子编辑"]
RU["RedisUtils<br/>Redisson工具集"]
end
subgraph "缓存配置层"
TCM["TimeoutRedisCacheManager<br/>动态过期CacheManager"]
YCAC["YudaoCacheAutoConfiguration<br/>缓存配置装配"]
YCAP["YudaoCacheProperties<br/>缓存属性"]
end
subgraph "监控层"
CTRL["RedisController<br/>监控接口"]
VO["RedisMonitorRespVO<br/>监控响应"]
CVT["RedisConvert<br/>命令统计转换"]
end
DAO --> RC
DAO --> RU
DAO --> DO
DAO --> CONST
TCM --> YCAC
YCAC --> YCAP
CTRL --> VO
CTRL --> CVT

图表来源

章节来源

核心组件

  • 缓存键设计与命名规范
    • 黑名单主键:id:app:blacklisted: {id}
    • 按MAC/渠道/区域维度:blacklisted:mac:{mac}、blacklisted:channel:{channelId}、blacklisted:region: {regionId}
    • 本地缓存键前缀:blacklist:ids:region、blacklist:ids:channel、blacklist:ids:mac、blacklist:info
  • 数据结构选择
    • Set:按MAC/渠道/区域维度存储“应用黑名单ID集合”,支持O(1)成员添加/删除
    • String:主键缓存“黑名单详情对象”,配合随机过期
    • Hash:规则引擎场景用于“规则ID->业务ID集合”等KV映射
  • 过期策略
    • 主键随机过期:由配置属性控制随机范围,降低缓存雪崩风险
    • 动态过期:CacheManager支持“cacheName#ttl”,按缓存粒度灵活设置
  • 更新机制
    • 延迟双删:写后短暂休眠再删除,缓解“脏读”
    • Lua原子编辑:批量对多个Set进行add/remove,保证一致性
    • 批量删除:Redisson Lua脚本批量删除Hash子键,降低网络往返
  • 监控与运维
    • 提供Redis监控接口,采集info、dbSize、commandstats,输出命令统计与CPU消耗

章节来源

架构总览

黑名单系统的Redis缓存采用“多级缓存 + 原子化更新”的设计:

  • 应用层通过DAO统一操作缓存键,按MAC/渠道/区域维度维护Set集合
  • 使用Redisson/Lua实现原子编辑,避免分布式锁开销
  • 通过随机过期与动态过期结合,平衡命中率与一致性
  • 监控接口提供实时洞察,辅助容量规划与性能优化

Mermaid Diagram Code:

sequenceDiagram
participant Biz as "业务逻辑"
participant DAO as "AppBlacklistedRedisDAO"
participant RC as "RedisClient(Lua)"
participant RU as "RedisUtils(Redisson)"
participant Redis as "Redis"
Biz->>DAO : 更新黑名单范围(新增/删除)
DAO->>RC : sEditLua(addKeys, removeKeys, value, expireSeconds)
RC->>Redis : 执行Lua脚本(SADD/SREM/EXPIRE)
Redis-->>RC : 执行结果
DAO->>RU : 清理本地缓存(LocalCacheConstants)
RU-->>DAO : 清理完成
DAO-->>Biz : 更新完成

图表来源

详细组件分析

缓存键设计与数据结构

  • 键命名规范
    • 黑名单详情:id:app:blacklisted: {id}
    • 按MAC/渠道/区域维度:blacklisted:mac:{mac}、blacklisted:channel:{channelId}、blacklisted:region: {regionId}
    • 本地缓存:blacklist:ids:region、blacklist:ids:channel、blacklist:ids:mac、blacklist:info
  • 数据结构选择
    • Set:适合“黑名单ID集合”场景,支持O(1)成员操作
    • String:适合“黑名单详情对象”缓存,配合随机过期
    • Hash:规则引擎场景用于“规则ID->业务ID集合”映射

Mermaid Diagram Code:

erDiagram
BLACKLISTED {
string id PK
string name
boolean valid
long bpm_status
}
MAC_BLACKLIST_SET {
string key PK
set blacklist_ids
}
CHANNEL_BLACKLIST_SET {
string key PK
set blacklist_ids
}
REGION_BLACKLIST_SET {
string key PK
set blacklist_ids
}
BLACKLISTED_DETAIL {
string key PK
json detail
}
BLACKLISTED ||--o{ MAC_BLACKLIST_SET : "按MAC维护集合"
BLACKLISTED ||--o{ CHANNEL_BLACKLIST_SET : "按渠道维护集合"
BLACKLISTED ||--o{ REGION_BLACKLIST_SET : "按区域维护集合"
BLACKLISTED ||--|| BLACKLISTED_DETAIL : "主键详情缓存"

图表来源

章节来源

过期策略与分层缓存

  • 主键随机过期
    • 通过配置属性设置随机过期范围,降低同时过期导致的缓存雪崩
  • 动态过期
    • CacheManager支持“cacheName#ttl”,按缓存粒度灵活设置过期时间
  • 本地缓存
    • Caffeine本地缓存作为一级缓存,提升热点数据命中率,降低Redis压力

Mermaid Diagram Code:

flowchart TD
Start(["缓存写入"]) --> PickPolicy["选择过期策略"]
PickPolicy --> RandomExpire["随机过期(主键)"]
PickPolicy --> DynamicTTL["动态TTL(cacheName#ttl)"]
PickPolicy --> NoExpire["不过期(仅本地缓存)"]
RandomExpire --> WriteRedis["写入Redis"]
DynamicTTL --> WriteRedis
NoExpire --> LocalOnly["仅本地缓存"]
WriteRedis --> End(["完成"])
LocalOnly --> End

图表来源

章节来源

缓存更新机制与一致性

  • 延迟双删
    • 写入后短暂休眠再删除,缓解“脏读”窗口
  • 原子编辑
    • Lua脚本批量对多个Set进行add/remove,保证一致性
  • 批量删除
    • Redisson Lua脚本批量删除Hash子键,降低网络往返

Mermaid Diagram Code:

sequenceDiagram
participant Biz as "业务逻辑"
participant DAO as "AppBlacklistedRedisDAO"
participant RC as "RedisClient(Lua)"
participant RU as "RedisUtils(Redisson)"
Biz->>DAO : 修改黑名单范围
DAO->>RC : sEditLua(addKeys, removeKeys, value, expireSeconds)
RC-->>DAO : 执行成功
DAO->>DAO : Thread.sleep(300ms)
DAO->>RC : sEditLua(addKeys, removeKeys, value, expireSeconds)
DAO->>RU : 清理本地缓存(LocalCacheConstants)
DAO-->>Biz : 更新完成

图表来源

章节来源

监控指标与性能分析

  • 指标采集
    • info:Redis服务器信息
    • dbSize:数据库键总数
    • commandstats:命令调用次数与CPU消耗
  • 指标解读
    • 命中率:GET/HGET等读命令占比与miss情况
    • 内存使用:used_memory、fragmentation_ratio
    • 性能瓶颈:commandstats中耗时高的命令(如DEL、HDEL、SADD/SREM)

Mermaid Diagram Code:

sequenceDiagram
participant Admin as "管理员"
participant Ctrl as "RedisController"
participant RT as "RedisTemplate"
participant Conv as "RedisConvert"
Admin->>Ctrl : GET /infra/redis/monitor
Ctrl->>RT : info/dbSize/commandstats
RT-->>Ctrl : 返回统计数据
Ctrl->>Conv : 转换为RedisMonitorRespVO
Conv-->>Ctrl : 响应对象
Ctrl-->>Admin : 返回监控结果

图表来源

章节来源

规则引擎缓存架构参考

规则引擎的缓存键设计与黑名单类似,均采用“维度键 + 集合/详情”的模式,并强调批量更新与原子化操作,可作为黑名单缓存设计的参考实践。

章节来源

依赖分析

  • 组件耦合
    • DAO依赖RedisClient/RedisUtils进行原子操作与批量删除
    • CacheManager依赖配置属性控制过期策略
    • 监控接口依赖RedisTemplate与转换器
  • 外部依赖
    • Redisson/RedisTemplate:提供原子操作与Lua脚本执行能力
    • Spring Cache:提供@Cacheable/@CacheEvict等注解支持

Mermaid Diagram Code:

graph TB
DAO["AppBlacklistedRedisDAO"] --> RC["RedisClient"]
DAO --> RU["RedisUtils"]
DAO --> CONF["YudaoCacheProperties"]
TCM["TimeoutRedisCacheManager"] --> CONF
CTRL["RedisController"] --> RT["RedisTemplate"]
CTRL --> CVT["RedisConvert"]

图表来源

章节来源

性能考虑

  • 命中率优化
    • 热点键采用随机过期,避免集中过期
    • 本地Caffeine缓存作为一级缓存,减少Redis压力
  • 延迟与吞吐
    • 原子Lua脚本替代多轮网络往返,提升批量更新吞吐
    • 批量删除脚本降低网络开销
  • 内存压力
    • 合理设置随机过期范围,避免缓存雪崩
    • 监控dbSize与used_memory,及时扩容或淘汰策略

[本节为通用指导,无需列出具体文件来源]

故障排查指南

  • 常见问题
    • 命中率低:检查热点键是否被频繁失效或过期时间过短
    • 内存飙升:关注dbSize与used_memory,确认是否有异常键增长
    • 性能瓶颈:查看commandstats中耗时高的命令,优化批量操作
  • 排查步骤
    • 通过监控接口获取info/dbSize/commandstats
    • 结合业务日志定位高频键与异常操作
    • 调整随机过期范围与动态TTL策略

章节来源

结论

黑名单系统的Redis缓存设计以“键命名规范 + 数据结构选择 + 原子化更新 + 动态过期 + 本地缓存 + 监控运维”为核心,既满足高并发场景下的性能需求,又兼顾一致性与可维护性。建议在生产环境中结合监控指标持续优化过期策略与批量操作,确保系统稳定与高效。

[本节为总结性内容,无需列出具体文件来源]

附录

  • 高可用部署建议
    • 使用Redis Sentinel或Cluster实现主从复制与自动故障转移
    • 多实例部署,结合负载均衡与健康检查
    • Jenkins自动化部署脚本支持多容器实例与端口映射

章节来源

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答