MST
星途 面试题库

面试题:缓存设计之Redis分布式缓存一致性问题

在分布式系统下,Redis缓存可能会出现缓存与数据库数据不一致的情况。请阐述可能导致这种不一致的原因,并详细说明如何设计一套机制来尽量减少或解决这种不一致,包括但不限于读写策略的调整、缓存失效时间的设置等方面。
18.2万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

可能导致不一致的原因

  1. 并发读写问题:在高并发场景下,写操作先更新数据库,还未来得及更新缓存,读操作就从缓存中读取到了旧数据。
  2. 缓存删除失败:删除缓存操作失败,导致旧数据一直存在于缓存中,而数据库数据已更新。
  3. 缓存更新策略不当:如采用先更新缓存再更新数据库策略,若更新数据库失败,缓存与数据库数据不一致。

减少或解决不一致的机制设计

  1. 读写策略调整
    • 先更新数据库,再删除缓存:写操作先更新数据库,成功后再删除缓存。读操作时若缓存不存在则从数据库读取并更新缓存。此策略可有效避免并发读写问题,但在高并发下可能出现短暂不一致。
    • 读写锁:对关键数据的读写操作加锁,确保同一时间只有一个写操作或读操作,能有效解决并发问题,但性能较低,不适用于高并发场景。
  2. 缓存失效时间设置
    • 合理设置缓存过期时间:对不同数据设置不同的过期时间,重要数据过期时间短,一般数据过期时间长。过期后再次读取时从数据库加载并更新缓存,可减少不一致时间。
    • 主动更新缓存:在数据更新时,不仅删除缓存,还可设置一个较短的预过期时间,在预过期时间内主动从数据库加载数据更新缓存,减少用户感知到不一致的可能性。
  3. 重试机制
    • 缓存删除重试:对于缓存删除失败的情况,设置重试机制。可以采用定时重试,或在应用程序中捕获删除失败异常进行重试,直到删除成功,确保缓存及时更新。
  4. 异步处理
    • 使用消息队列:将写操作的缓存更新或删除操作发送到消息队列中,由专门的消费者异步处理。这样可减少写操作的响应时间,同时通过消息队列的重试机制保证缓存操作的最终一致性。
  5. 双写一致性解决方案
    • 引入中间件:如使用Canal组件,通过监听数据库的binlog日志,实时感知数据库的变化,并同步更新缓存,保证缓存与数据库的一致性。