缓存和数据库不一致出现的原因及其解决

cache与db不一致的原因,读与写出现并发。

理论上,給cache设置过期时间,是保证最终一致性到解决方案。这种方案下,写操作以数据库为准。更新cache失败,只要到了过期时间,后面的读请求会从数据库中读取新值存入cache。不过,实际开发中只设过期时间不足以满足需求,出现3种策略。

  • 先更新DB,再更新cache
  • 先更新DB,再删除cache
  • 先删cache,再更新DB 

对于第一种策略,开发中遇到比较少,原因如下:

  1. 如果写比读多,读取数据跟不上cache的频繁更新,浪费性能
  2. 如果DB的值需要经过一系列计算写入cache,每次更新DB,都要计算再写入cache,浪费性能

后面2种策略,开发中体现以下几个场景:

  1. 先更新DB,再删除cache,删除cache失败
  2. 当删除完cache的时候,这时去更新DB,但还没有更新完,另外一个请求来查询数据,发现cache里没有,就去DB里查,再把DB旧数据存入缓存中

解决方案:

场景1

  1. 先删除cache,再更新DB,如果删除cache失败,就不更新DB。重试机制,删除cache。

场景2

  1. 利用消息队列,更新cache

DB产生新的增删改操作放入队列中,操作执行完发消息给cache,cache数据进行更新。如果中途出现查询,同步等待cache更新完成。

详细资料可以参考:https://www.cnblogs.com/rjzheng/p/9041659.html

通常做法:

写数据只写DB

更新数据,先更新DB;读数据,先读cache

cache存热点数据

相关推荐