MST

星途 面试题库

面试题:缓存设计:如何设计分布式系统中的缓存一致性策略

假设你正在开发一个大型分布式后端系统,该系统包含多个服务节点和缓存集群,不同服务节点可能会对相同数据进行读写操作。请描述你会如何设计缓存一致性策略,以确保数据的一致性和系统的高性能,同时需要考虑网络延迟、节点故障等因素。
49.8万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

1. 缓存更新策略

  • 写后更新缓存:在数据写入数据库成功后,再更新缓存。优点是实现简单,但在高并发写入时可能出现缓存和数据库数据不一致情况,如 A 写操作刚更新完数据库,还未更新缓存时,B 读操作读到旧缓存数据。
  • 写前失效缓存:在写入数据库前先失效缓存。能避免写后更新缓存的问题,但如果写数据库失败,缓存已失效,后续读操作会直接穿透到数据库。
  • 读写锁策略:在更新数据时获取写锁,禁止其他读写操作;读操作获取读锁,允许并发读。可有效保证一致性,但会影响系统并发性能。

2. 缓存同步机制

  • 分布式缓存一致性协议:如使用 Redis 集群时,可采用 Raft 或 Paxos 协议保证数据在各节点间的一致性。这些协议通过选举 leader 节点,leader 负责数据同步,follower 节点从 leader 同步数据,即使部分节点故障也能保证一致性。
  • 消息队列同步:将缓存更新操作发送到消息队列,各节点从消息队列消费更新消息,按顺序更新缓存。能有效应对网络延迟和节点故障,如某节点故障恢复后可从消息队列重新消费未处理的更新消息。

3. 缓存过期策略

  • 定期过期:为缓存数据设置过期时间,到期后自动删除。能保证缓存数据的新鲜度,但可能导致大量缓存同时过期,增加数据库压力。
  • 惰性过期:在读取缓存数据时检查是否过期,过期则从数据库加载新数据并更新缓存。减少了过期任务开销,但可能长时间保留过期数据占用内存。可结合两者,定期删除部分过期数据,读取时检查剩余过期数据。

4. 故障处理

  • 节点故障检测:通过心跳机制定期检测节点状态,如某个节点在一定时间内未响应心跳,则判定为故障节点。
  • 故障转移:当检测到节点故障时,使用备用节点接管故障节点的工作。对于缓存集群,可采用主从复制模式,主节点故障时从节点晋升为主节点继续提供服务。
  • 数据恢复:故障节点恢复后,可通过数据同步机制(如上述的分布式协议或消息队列)重新同步数据,保证数据一致性。

5. 性能优化

  • 缓存分片:将缓存数据按一定规则(如哈希算法)分布到不同节点,减少单个节点压力,提高系统整体性能。
  • 多级缓存:采用本地缓存(如 Guava Cache)和分布式缓存(如 Redis)结合的方式,本地缓存处理高频访问数据,减少对分布式缓存的请求,降低网络延迟。
  • 异步更新:将缓存更新操作异步化,如使用线程池或消息队列,减少同步更新对业务操作的影响,提高系统响应速度。