缓存的重要性
- 定义:缓存是暂时保存数据的存储机制,用于加速数据读取和访问。
- 目的:用更多的存储空间来存储重复使用或计算的数据,减少数据重新获取或计算的时间。
- 类型:
- 本地缓存:如JDK的HashMap、ConcurrentHashMap,Ehcache、Guava Cache、Spring Cache、Caffeine等。
- 分布式缓存:如Redis,可独立部署在不同服务器。
缓存一致性问题
- 原因:
- 缓存过期
- 写操作延迟
- 并发操作导致的竞态条件
- 缓存失效策略不当
- 网络延迟或故障
解决方案
- Cache Aside 模式:读时先查缓存,未命中则从数据库读取并更新缓存;写时先更新数据库,再使缓存失效。
- 分布式锁:并发写操作时使用,避免竞态条件。
- 双写一致性:同时更新数据库和缓存。
- 延迟双删:写操作时先删除缓存,数据库更新后再删除缓存。
- 版本控制:使用版本号或时间戳检查数据一致性。
- 监控和告警:监控数据,发现不一致时及时处理。
常见缓存更新策略
- Cache Aside Pattern:优点是读取性能高和实现简单;缺点是写操作较慢和数据一致性挑战。
- Read/Write Through Pattern:优点是数据一致性好;缺点是实现复杂,依赖缓存高可用性。
- Write Behind Pattern:优点是写操作性能高;缺点是存在数据丢失风险和数据一致性较差。
PmHub 实践
- 数据读取:先查询缓存,未命中则查询数据库后更新缓存。
- 数据更新:先更新数据库,然后删除缓存。
面试准备
- 项目中的缓存一致性:根据理解作答,展示真实性。
- Redis 数据类型:基础问题,需熟悉。
- 删除缓存而非更新:减少服务器资源消耗,避免脏读,减少并发冲突,避免双写问题。
其他要点
- Cache Aside 局限性:写操作性能较低,数据一致性挑战,缓存预热问题,复杂的失效策略,过期数据风险。
- 解决方案不完美性:需根据应用场景设计合理的缓存更新和失效策略。