面试题答案
一键面试1. 缓存更新策略
- 写后更新缓存:在数据写入数据库成功后,再更新缓存。优点是实现简单,但在高并发写入时可能出现缓存和数据库数据不一致情况,如 A 写操作刚更新完数据库,还未更新缓存时,B 读操作读到旧缓存数据。
- 写前失效缓存:在写入数据库前先失效缓存。能避免写后更新缓存的问题,但如果写数据库失败,缓存已失效,后续读操作会直接穿透到数据库。
- 读写锁策略:在更新数据时获取写锁,禁止其他读写操作;读操作获取读锁,允许并发读。可有效保证一致性,但会影响系统并发性能。
2. 缓存同步机制
- 分布式缓存一致性协议:如使用 Redis 集群时,可采用 Raft 或 Paxos 协议保证数据在各节点间的一致性。这些协议通过选举 leader 节点,leader 负责数据同步,follower 节点从 leader 同步数据,即使部分节点故障也能保证一致性。
- 消息队列同步:将缓存更新操作发送到消息队列,各节点从消息队列消费更新消息,按顺序更新缓存。能有效应对网络延迟和节点故障,如某节点故障恢复后可从消息队列重新消费未处理的更新消息。
3. 缓存过期策略
- 定期过期:为缓存数据设置过期时间,到期后自动删除。能保证缓存数据的新鲜度,但可能导致大量缓存同时过期,增加数据库压力。
- 惰性过期:在读取缓存数据时检查是否过期,过期则从数据库加载新数据并更新缓存。减少了过期任务开销,但可能长时间保留过期数据占用内存。可结合两者,定期删除部分过期数据,读取时检查剩余过期数据。
4. 故障处理
- 节点故障检测:通过心跳机制定期检测节点状态,如某个节点在一定时间内未响应心跳,则判定为故障节点。
- 故障转移:当检测到节点故障时,使用备用节点接管故障节点的工作。对于缓存集群,可采用主从复制模式,主节点故障时从节点晋升为主节点继续提供服务。
- 数据恢复:故障节点恢复后,可通过数据同步机制(如上述的分布式协议或消息队列)重新同步数据,保证数据一致性。
5. 性能优化
- 缓存分片:将缓存数据按一定规则(如哈希算法)分布到不同节点,减少单个节点压力,提高系统整体性能。
- 多级缓存:采用本地缓存(如 Guava Cache)和分布式缓存(如 Redis)结合的方式,本地缓存处理高频访问数据,减少对分布式缓存的请求,降低网络延迟。
- 异步更新:将缓存更新操作异步化,如使用线程池或消息队列,减少同步更新对业务操作的影响,提高系统响应速度。