面试题答案
一键面试常见分布式缓存一致性协议
- 写后失效(Write - After - Invalidate)
- 保证缓存一致性方式:当数据在数据库中被更新后,立即使相关的缓存失效。后续读取请求发现缓存失效,会从数据库中读取最新数据,并重新填充到缓存中。这种方式实现简单,但在数据更新后到下次读取前,缓存中的数据是旧的,可能导致短暂的数据不一致。
- 写前失效(Write - Before - Invalidate)
- 保证缓存一致性方式:在对数据库进行写操作前,先使相关的缓存失效。这样能确保写操作后,下次读取一定会从数据库获取最新数据并更新缓存。但如果写操作失败,缓存已失效,可能会造成一段时间内缓存缺失,影响读取性能。
- 写后更新(Write - After - Update)
- 保证缓存一致性方式:在数据库更新成功后,同时更新缓存。这种方式能保证缓存中的数据及时与数据库同步,但如果在更新缓存过程中出现故障,可能导致数据库与缓存数据不一致。并且在高并发场景下,可能出现更新顺序问题,比如先更新缓存 A,再更新缓存 B,但由于网络等原因,缓存 B 的更新先于缓存 A 完成,导致缓存数据顺序与数据库不一致。
- 写前更新(Write - Before - Update)
- 保证缓存一致性方式:在对数据库进行写操作前,先更新缓存。但如果写数据库操作失败,而缓存已更新,会造成缓存与数据库数据不一致。需要额外的机制来处理这种情况,比如引入事务回滚机制,在写数据库失败时,将缓存恢复到原来状态。
- 读写锁协议
- 保证缓存一致性方式:对缓存数据的访问加读写锁。读操作可以并发进行,因为读操作不会改变数据状态,不会导致不一致问题。写操作则需要获取写锁,在写操作期间,其他读写操作都被阻塞,直到写操作完成并释放锁。这样能确保在写操作时,缓存数据不会被其他操作干扰,保证了缓存一致性,但可能会影响系统的并发性能。
- MESI协议(Modified, Exclusive, Shared, Invalid)
- 保证缓存一致性方式:用于多核处理器缓存一致性。每个缓存行有 M(已修改)、E(独占)、S(共享)、I(无效)四种状态。当一个处理器修改了缓存行数据,其状态变为 M,同时其他处理器中对应的缓存行状态变为 I。当处于 M 状态的缓存行数据写回主存后,状态变为 E 或 S(取决于其他处理器是否也有该缓存行副本)。通过处理器之间的消息传递来维护缓存行状态的一致性,确保各个处理器缓存中的数据与主存数据保持一致。 此协议主要应用于硬件层面的缓存一致性,不适用于分布式缓存场景,但原理有一定借鉴意义。
- Gossip协议
- 保证缓存一致性方式:节点之间通过随机的方式相互通信,交换各自的缓存状态信息。每个节点会定期向其他随机选择的节点发送自己的缓存数据摘要等信息,接收方根据这些信息判断是否有数据不一致情况,如果有则进行同步。这种方式最终能达到缓存一致性,但一致性的收敛速度相对较慢,在大规模分布式系统中可能需要较长时间才能使所有节点缓存一致。