缓存与一致性
→ 返回 Redis
架构总览:缓存架构。
Cache Aside(旁路缓存)
读:缓存 → miss → DB → 写缓存
写:更新 DB → 删除缓存(推荐)
先删缓存再写库;高并发可 延迟双删。
| 不一致场景 | 原因 |
|---|---|
| 乱序 | 删缓存后写库前,另一请求回填旧值 |
| 主从延迟 | 写主删缓存,读从旧值再缓存 |
| 双写 | 同时写 Redis 与 MySQL |
强一致:读主、版本号、Canal 刷缓存,或接受最终一致。
多级缓存
请求 → Caffeine(本地)→ Redis → DB
本地缓存需 失效广播(Pub/Sub / MQ)。
缓存三大问题
穿透
不存在 key 打穿 DB → 空值短 TTL、布隆过滤器、接口校验。
击穿
热点 key 过期瞬间并发回源 → 互斥锁、逻辑过期、热点永不过期。
雪崩
大量 key 同时过期或 Redis 不可用 → TTL 抖动、Sentinel/Cluster、Sentinel 降级、预热。
分布式限流
| 方式 | 说明 |
|---|---|
| 固定窗口 INCR | 边界可能 2× 突发 |
| 滑动窗口 Lua | 更平滑 |
Redisson RRateLimiter | 令牌桶 |
| Gateway | 集中限流 |
Cluster 下限流 key 固定 slot。
Session / 幂等 / 去重
| 场景 | 做法 |
|---|---|
| Session | SET session:<id> ... EX |
| 幂等 | SET idempotent:<key> 1 NX EX |
| 消息去重 | SET msg:dedup:<id> 1 NX + MQ |
| 序号 | INCR 或 分布式 ID |
见 接口幂等性。