Redis 多级缓存系列索引:架构、读写链路与学习路线
578 字
3 分钟
Redis 多级缓存系列索引:架构、读写链路与学习路线
1. 文档导航
-
多级缓存:进程缓存整理
认识多级缓存、Caffeine、本地进程缓存及其边界。 -
Lua 语法入门:整理与补充
掌握 OpenResty 脚本所需的 Lua 变量、类型、函数、table、模块和常见陷阱。 -
多级缓存实战:OpenResty 与 Tomcat
学习 OpenResty 配置、请求参数、内部子请求、CJSON、Tomcat 集群和请求聚合。 -
多级缓存实战:Redis 与 Nginx 本地缓存
完成 shared dict → Redis → Tomcat/Caffeine → MySQL 的查询链。 -
缓存同步:策略选择与 Canal 实战
比较同步方案,搭建 Canal,并补齐库存、OpenResty L1 和多 JVM 同步边界。
2. 最终架构
flowchart TD
U["浏览器"]
EN["入口 Nginx"]
OR["OpenResty\nLua + shared dict"]
R[("Redis")]
T1["Tomcat 1\nCaffeine"]
T2["Tomcat 2\nCaffeine"]
DB[("MySQL")]
C["Canal"]
S["缓存同步消费者"]
U --> EN --> OR
OR --> R
OR --> T1
OR --> T2
T1 --> DB
T2 --> DB
DB -. "binlog" .-> C --> S
S -. "更新/失效" .-> R
S -. "更新/失效" .-> T1
S -. "更新/失效" .-> T2
S -. "需额外设计" .-> OR
3. 一次读请求
浏览器 → 入口 Nginx → OpenResty shared dict → 命中:直接返回 → 未命中:查询 Redis → 命中:回填 shared dict 后返回 → 未命中:请求 Tomcat → 查询 Caffeine → 命中:返回 → 未命中:查询 MySQL 并回填 Caffeine4. 一次数据更新
主链:
后台修改 MySQL → MySQL 写 binlog → Canal 读取事件 → Java Handler → 更新 Redis → 更新当前 JVM 的 Caffeine5. 推荐练习顺序
- 启动两个 Java 实例,验证相同 URI 的哈希路由。
- 在 OpenResty 中完成商品和库存的 Tomcat 聚合。
- 启动 Redis,执行预热并验证 key。
- 加入 shared dict,观察首次和再次请求的命中层级。
- 修改 MySQL 商品表,观察 Canal → Redis/Caffeine。
- 在 OpenResty L1 未过期时再次请求,观察旧值窗口。
- 补充库存表处理器并重复验证。
- 设计能覆盖所有 JVM 和 OpenResty 节点的失效消息。
6. 核心结论
- 多级缓存的价值是逐层吸收流量,不是层级越多越好。
- 越靠近用户的缓存越快,但同步和失效越困难。
- TTL 是兜底,不是完整同步方案。
- Canal 负责捕获数据库变化,消费者才真正决定缓存如何收敛。
- 命中率、延迟和一致性必须一起观测。














