MST

星途 面试题库

面试题:Redis缓存与MySQL数据一致性:缓存更新策略

在使用Redis作为缓存,MySQL作为持久化存储时,有哪些常见的缓存更新策略来保证数据一致性?请简述每种策略的优缺点。
47.1万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

1. 先更新数据库,再删除缓存

  • 优点
    • 操作相对简单,符合一般的开发逻辑,先确保数据库数据的准确性,再清理可能存在的旧缓存数据。
    • 由于是先更新数据库,能保证数据库的事务完整性,在数据库层面的数据一致性更容易保证。
  • 缺点
    • 在高并发场景下,可能出现缓存和数据库数据不一致的情况。例如,线程A更新了数据库,在删除缓存之前,线程B查询数据,此时缓存还未删除,B查询到的是旧数据,然后线程A删除缓存,就出现了数据不一致。

2. 先删除缓存,再更新数据库

  • 优点
    • 理论上可以快速让缓存失效,后续的查询操作会促使从数据库加载新数据到缓存,能在一定程度上保证数据的实时性。
  • 缺点
    • 同样在高并发场景下存在问题。比如线程A删除缓存后,还没来得及更新数据库,线程B查询发现缓存不存在,从数据库读取旧数据并写入缓存,之后线程A更新数据库,这就导致缓存和数据库数据不一致。
    • 若更新数据库操作失败,而缓存已删除,会导致一段时间内数据无法从缓存获取,只能从数据库读取,增加数据库压力。

3. 先更新数据库,再更新缓存

  • 优点
    • 直观上能保证数据一致性,只要更新操作都成功,缓存和数据库数据就保持同步。
  • 缺点
    • 存在缓存更新的原子性问题。如果更新缓存操作失败,而数据库更新成功,会导致数据不一致。
    • 相比先更新数据库再删除缓存,更新缓存的成本更高,尤其是复杂数据结构的缓存更新。
    • 在高并发场景下,可能会出现缓存“脏写”问题,比如多个线程同时更新数据库和缓存,由于网络延迟等原因,可能导致缓存数据更新顺序错乱,与数据库不一致。

4. 双写一致性方案(异步更新缓存)

  • 优点
    • 利用异步操作减少对业务流程的阻塞,提高系统的响应性能。例如使用消息队列,将缓存更新操作异步化,主线程可以快速返回。
    • 可以在消息队列消费端进行一些复杂的逻辑处理,如合并多个更新操作,减少对缓存的无效更新,提高缓存更新效率。
  • 缺点
    • 引入消息队列增加了系统复杂度,需要处理消息队列的高可用、消息丢失、重复消费等问题。
    • 异步操作存在一定延迟,在延迟期间缓存和数据库数据不一致。如果对数据一致性要求极高,可能不适用。