缓存与数据库一致性实战

共 18 题
#

1. Cache-Aside 下先更新数据库再删缓存为什么是主流方案?延迟双删和订阅 binlog(Canal)方案分别解决什么残留问题?

A 先删缓存再更新 DB 是主流方案
B 延迟双删与 Canal 会引入更多不一致
C 先更新 DB 再删缓存,即使删失败也只是短暂读到旧值 ✓ 正确答案
D 删除缓存失败无法补救
#

2. 缓存与数据库不一致的所有产生时序(并发读写交错)如何系统枚举与规避?

A 先删缓存再更新 DB 不会产生不一致
B 删除缓存失败不会导致不一致
C 读旧写新是一致性被破坏的典型时序,需用版本号或锁规避 ✓ 正确答案
D 并发写不会产生不一致
#

3. 缓存穿透、缓存击穿、缓存雪崩三大问题的根因、检测方法与工程解决方案?

A 缓存击穿用互斥锁或逻辑过期避免并发回源 ✓ 正确答案
B 缓存穿透是热点 key 过期导致的
C 缓存雪崩是单个 key 过期
D 布隆过滤器用于解决缓存雪崩
#

4. Cache Aside 的缓存删除失败、并发读写竞态(读旧写新)如何用延迟双删/版本号解决?

A 版本号通过校验 DB 版本防止旧值覆盖新缓存 ✓ 正确答案
B 延迟双删是在更新 DB 前删除缓存
C 删除失败无法解决
D 延迟双删会加重不一致
#

5. 缓存一致性在生产中的验收方法(故障注入、并发压测与监控指标)

A 并发压测无法发现竞态
B 一致性只能靠代码审查无法验证
C 监控指标与一致性无关
D 故障注入用于验证系统在异常下的行为 ✓ 正确答案
#

6. 缓存穿透/击穿/雪崩的应对,布隆过滤器、互斥锁与过期随机化?

A 互斥锁用于缓存击穿,只允许一个请求回源重建 ✓ 正确答案
B 布隆过滤器用于解决缓存击穿
C 过期随机化用于拦截无效查询
D 布隆过滤器能精确判断 key 是否存在
#

7. 读写穿透(Read/Write-Through)与写回(Write-Behind)模式在工程中少见的原因?

A Write-Behind 写缓存后立即同步写 DB
B Cache-Aside 工程上少用
C Write-Through 把缓存作主入口,缓存故障时应用不可用 ✓ 正确答案
D Write-Behind 无数据丢失风险
#

8. 多级缓存(本地缓存 Caffeine + 分布式缓存 Redis)的一致性挑战,本地缓存如何感知远端失效?

A 本地缓存能自动感知远端更新
B 本地缓存 TTL 越长越一致
C 多级缓存没有一致性问题
D 本地缓存靠 Redis Pub/Sub 广播失效通知 + 短 TTL 兜底感知失效 ✓ 正确答案
#

9. 缓存预热(Warm-up)与缓存降级策略,系统重启或缓存集群故障时如何保护数据库?

A 预热在系统启动时加载热点数据,避免冷启动打爆 DB ✓ 正确答案
B 预热是故障时绕过缓存
C 缓存故障时无需降级
D 降级会加重 DB 压力
#

10. 热点 Key 的识别与治理,如何防止单个热点 Key 导致 Redis 单节点过载?

A 限流会降低热点 key 的访问
B 热点 key 复制分片只会加剧单节点负担
C 热点 key 无法识别
D 本地缓存可减少热点 key 对 Redis 的访问 ✓ 正确答案
#

11. 缓存与 DB 的一致性在强一致业务(库存/余额)下的取舍,何时必须同步失效?

A 强一致业务可接受最终一致
B 缓存值不参与业务正确性判断
C 强一致业务应优先用缓存读
D 库存/余额等业务更新 DB 后必须同步删缓存并保证成功 ✓ 正确答案
#

12. 多级缓存(本地+分布式)的一致性与失效广播(Redis Pub/Sub)如何设计?

A 本地缓存靠 Pub/Sub 广播失效 + 短 TTL 兜底保证一致 ✓ 正确答案
B Pub/Sub 广播失效后无需 TTL 兜底
C Pub/Sub 消息永不丢失
D 版本号无法防旧值回填
#

13. 缓存击穿与热点 Key,逻辑过期与分布式锁?

A 逻辑过期会阻塞读请求
B 分布式锁无法避免并发回源
C 互斥锁方案永远返回旧值
D 逻辑过期返回旧值并异步重建,读完不阻塞 ✓ 正确答案
#

14. Caffeine 的 refreshAfterWrite 与 expireAfterWrite 对缓存一致性的影响

A refreshAfterWrite 到期后 key 立即被移除
B refreshAfterWrite 异步刷新,读不阻塞但可能短暂读到旧值 ✓ 正确答案
C expireAfterWrite 不会引起并发穿透
D 两者都会阻塞读
#

15. 缓存版本化(Versioned Cache)与最终一致性 SLA,业务可接受多长时间的缓存不一致?如何度量?

A 最终一致性 SLA 与业务无关
B 版本化缓存用版本比对防止读旧值 ✓ 正确答案
C 一致时长无法度量
D 版本号只用于缓存淘汰
#

16. 缓存击穿修复方案(互斥锁/逻辑过期)与缓存雪崩的随机过期策略如何组合?

A 热点 key 用随机 TTL 解决击穿
B 随机过期策略用于解决击穿
C 热点 key 用逻辑过期/互斥锁,普通 key 用随机 TTL,组合覆盖两类问题 ✓ 正确答案
D 两者无法组合
#

17. 缓存与数据库的双写一致性,消息队列最终一致?

A MQ 方案把缓存更新从 DB 事务中解耦并支持重试 ✓ 正确答案
B MQ 方案保证强一致
C MQ 方案不需要幂等
D MQ 方案无法处理删除失败
#

18. 缓存 Key 的设计规范(前缀、版本、TTL 分层)

A 缓存 key 无需前缀规范
B 统一前缀与版本号便于管理、隔离与排障 ✓ 正确答案
C TTL 分层会让缓存更易雪崩
D key 越长越利于在线查询