标准答案
- 本地缓存适合极热点、体积小、可短暂陈旧的数据,访问无需网络;分布式缓存适合多实例共享和较大的缓存容量。
- 通常读取顺序是本地缓存、分布式缓存、数据库,回填时本地 TTL 应比共享缓存更短或受版本控制,避免实例长期保留旧值。
- 数据库更新后可删除共享缓存并发布失效事件,让各实例删除本地副本;失效消息需要允许重复和丢失后的 TTL 兜底,不能假定所有实例都会实时收到。
- 对热点数据要防止每个实例同时回源,可在共享层做请求合并或互斥刷新,并限制本地缓存的容量和淘汰策略。
题目解析
两级缓存并不是自动更快。实例数量增加后,失效广播、版本同步和冷热不均都会增加复杂度;只有网络往返确实是瓶颈且数据允许短时陈旧时才值得引入。
强一致读取可以绕过本地缓存,或携带最小版本号检查。用很长的本地 TTL 掩盖共享缓存压力,常会把一致性问题推给用户。
常见误区
- 本地缓存和 Redis 使用相同长 TTL,却没有任何失效通知。
- 把 Pub/Sub 当可靠消息队列,断线实例永远收不到失效事件。