MST

星途 面试题库

面试题:缓存设计之中等难度:缓存一致性基础及常见场景

请阐述缓存一致性的概念,并举例说明在用户信息查询场景下,可能出现缓存一致性问题的情况,以及你会采用哪些常规手段来解决这个场景下的缓存一致性问题。
29.4万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存一致性概念

缓存一致性指的是在存在多个缓存副本的系统中,当数据发生变化时,所有缓存副本中的数据能够保持一致的状态。确保缓存数据与源数据存储(如数据库)中的数据一致,避免出现缓存中读取到过期或错误数据的情况。

用户信息查询场景下可能出现缓存一致性问题的情况

  1. 先更新数据库,后删除缓存失败:在更新用户信息到数据库后,尝试删除相关缓存时发生异常,导致缓存中仍然保留旧的用户信息。后续查询时,可能从缓存中获取到旧数据,造成数据不一致。
  2. 先删除缓存,后更新数据库失败:先删除了用户信息的缓存,在更新数据库时出现故障。此时其他请求查询用户信息,缓存不存在,会从数据库读取旧数据并重新写入缓存,从而缓存中保留的是旧数据,与数据库不一致。
  3. 并发读写问题:在高并发场景下,一个请求正在更新用户信息并删除缓存,同时另一个请求在缓存删除前读取到旧缓存数据,然后更新操作完成,新数据写入数据库但缓存已被读取,后续请求可能长时间读取到旧缓存数据。

解决该场景下缓存一致性问题的常规手段

  1. 延时双删策略:在更新数据库后,先删除缓存,等待一段合适的时间(根据业务场景确定),再次删除缓存。这可以减少在更新数据库和第一次删除缓存之间,其他请求读取到旧缓存数据并重新写入缓存的可能性。例如,在更新用户信息到数据库后,立即删除缓存,等待500毫秒后再次删除缓存。
  2. 读写锁:在更新用户信息时,获取写锁,阻止其他读请求。更新完成后释放写锁。读请求获取读锁,允许多个读请求同时进行,但写操作时会等待读锁全部释放。这可以避免并发读写造成的数据不一致,但可能会影响系统并发性能。
  3. 使用消息队列:将更新操作放入消息队列,确保操作顺序执行。更新数据库成功后,发送消息到队列,由队列消费消息并删除缓存。这样可以避免因并发操作导致的缓存不一致问题,同时解耦了数据库更新和缓存删除操作。
  4. 缓存版本号:在数据库中增加一个版本号字段,每次更新用户信息时,版本号递增。缓存中存储用户信息和对应的版本号。查询时,先从缓存获取数据和版本号,再从数据库获取最新版本号进行比对。如果不一致,则重新从数据库读取数据更新缓存。