缓存异常:如何解决缓存与数据库的一致性

缓存和数据库的数据不一致的产生原因


数据一致性

  • 缓存中有数据,那么,缓存中的数据值需要和数据库中的值相同
  • 缓存中没有数据,那么,数据库中的值必须是最新值

Redis缓存类型

  • 读写缓存
  • 只读缓存

读写缓存

数据的增删改,同步策略

  • 同步直写策略:写缓存时,同步写数据库
  • 异步回写策略:写缓存时不同步回写数据库;等到数据从缓存中淘汰时,再写回数据库。

想要保持一致性,使用 同步直写 策略;同时开启事务机制保持保证原子性

只读缓存

新增数据(天然一致)

  • 数据写数据库,缓存不操作;查询时缓存从数据库加载

删改数据

  • 问题一:先删除缓存,再更新数据库值:如果数据库更新失败,导致查询时,缓存同步回数据库旧值
  • 问题二:先更新数据库值,再删除缓存:如果缓存删除失败,导致查询时,查询到旧值

解决方法

操作失败 使用消息队列重试机制

并发问题: 导致读取到更新之前的值

缓存异常:如何解决缓存与数据库的一致性_第1张图片
先删除缓存,再更新数据库下并发问题

  • 采用延迟双删,即更新完数据库以后再删除一次缓存
缓存异常:如何解决缓存与数据库的一致性_第2张图片
先更新数据库,再删除缓存
  • 等待缓存删除完成,期间会有不一致数据短暂存在

建议方案

  1. 优先使用先更新数据库再删除缓存的方法:考虑缓存穿透和延迟双删等待时间不好预估
  2. 先更新数据库再删除缓存,建议先在Redis缓存客户端暂存并发读请求,等操作完成后,再读取数据,从而保持数据一致性

你可能感兴趣的:(缓存异常:如何解决缓存与数据库的一致性)