面试题答案
一键面试缓存一致性概念
缓存一致性指的是在存在多个缓存副本的系统中,当数据发生变化时,所有缓存副本中的数据能够保持一致的状态。确保缓存数据与源数据存储(如数据库)中的数据一致,避免出现缓存中读取到过期或错误数据的情况。
用户信息查询场景下可能出现缓存一致性问题的情况
- 先更新数据库,后删除缓存失败:在更新用户信息到数据库后,尝试删除相关缓存时发生异常,导致缓存中仍然保留旧的用户信息。后续查询时,可能从缓存中获取到旧数据,造成数据不一致。
- 先删除缓存,后更新数据库失败:先删除了用户信息的缓存,在更新数据库时出现故障。此时其他请求查询用户信息,缓存不存在,会从数据库读取旧数据并重新写入缓存,从而缓存中保留的是旧数据,与数据库不一致。
- 并发读写问题:在高并发场景下,一个请求正在更新用户信息并删除缓存,同时另一个请求在缓存删除前读取到旧缓存数据,然后更新操作完成,新数据写入数据库但缓存已被读取,后续请求可能长时间读取到旧缓存数据。
解决该场景下缓存一致性问题的常规手段
- 延时双删策略:在更新数据库后,先删除缓存,等待一段合适的时间(根据业务场景确定),再次删除缓存。这可以减少在更新数据库和第一次删除缓存之间,其他请求读取到旧缓存数据并重新写入缓存的可能性。例如,在更新用户信息到数据库后,立即删除缓存,等待500毫秒后再次删除缓存。
- 读写锁:在更新用户信息时,获取写锁,阻止其他读请求。更新完成后释放写锁。读请求获取读锁,允许多个读请求同时进行,但写操作时会等待读锁全部释放。这可以避免并发读写造成的数据不一致,但可能会影响系统并发性能。
- 使用消息队列:将更新操作放入消息队列,确保操作顺序执行。更新数据库成功后,发送消息到队列,由队列消费消息并删除缓存。这样可以避免因并发操作导致的缓存不一致问题,同时解耦了数据库更新和缓存删除操作。
- 缓存版本号:在数据库中增加一个版本号字段,每次更新用户信息时,版本号递增。缓存中存储用户信息和对应的版本号。查询时,先从缓存获取数据和版本号,再从数据库获取最新版本号进行比对。如果不一致,则重新从数据库读取数据更新缓存。