Cache(缓存)问题通常会影响性能、一致性、命中率或资源占用。要“怎么解”,核心在于先定位是哪一类问题,再对症下药。下面我按常见场景 + 对应解决方案给你一个清晰、可落地的总结。
现象:
请求的数据在缓存和数据库中都不存在,每次都打到数据库。
原因:
解决方案: ✅ 空值缓存
key -> null
TTL 设置短一点(5~30 秒)
✅ 参数校验
✅ 布隆过滤器(Bloom Filter)
✅ 限流 / 风控
现象:
某个热点 key 过期瞬间,大量请求直接打到数据库。
解决方案: ✅ 热点 key 永不过期
✅ 互斥锁(分布式锁)
只有第一个请求查 DB
其他请求等待或返回旧值
✅ 逻辑过期 + 异步刷新
缓存中存过期时间
过期后异步重建缓存
现象:
大量 key 同时失效,或缓存服务宕机,数据库瞬间被打爆。
解决方案: ✅ 过期时间随机化
TTL = base + random(0~300s)
✅ 多级缓存
✅ 缓存高可用
✅ 限流 & 降级
数据库更新后,缓存未同步。
✅ 先更新数据库,再删除缓存(最常用)
1. 更新 DB
2. 删除 Cache
✅ 延迟双删
1. 删除缓存
2. 更新 DB
3. 延迟再删一次缓存
✅ 订阅 binlog(Canal / Debezium)
✅ 设置合理 TTL
❌ 不推荐:先更新缓存再更新 DB
✅ 合理 key 设计
user:info:1001
order:list:2026-01
✅ 区分冷热数据
✅ 预加载缓存
✅ 监控命中率
Redis: INFO stats
keyspace_hits / (hits + misses)
✅ 设置 maxmemory + 淘汰策略
allkeys-lru
volatile-lru
✅ 避免大 key
✅ 压缩数据
✅ 定期清理
| 场景 | 推荐 |
|---|---|
| 本地缓存 | Caffeine、Guava |
| 分布式缓存 | Redis |
| 高并发热点 | Redis + 本地缓存 |
| 强一致 | DB + binlog 同步 |
1️⃣ 看日志(缓存命中 / 未命中)
2️⃣ 看 Redis 监控(QPS、内存、命中率)
3️⃣ 是否大量 key 同时失效
4️⃣ 是否有热点 key
5️⃣ DB 是否存在慢查询
缓存问题 = 命中率 + 一致性 + 可用性 + 数据合理性
如果你愿意,可以告诉我:
我可以直接帮你给出最优解 + 代码示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。