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

Posted ivy-xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存和数据库不一致出现的原因及其解决相关的知识,希望对你有一定的参考价值。

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存热点数据

以上是关于缓存和数据库不一致出现的原因及其解决的主要内容,如果未能解决你的问题,请参考以下文章

Redis学习笔记25——缓存异常:如何解决缓存和数据库的数据不一致问题?

Redis学习笔记25——缓存异常:如何解决缓存和数据库的数据不一致问题?

多线程之缓存一致性协议

Hibernate 查询数据为何和数据库不一致?

科普:CPU缓存一致性协议

如何保证数据库与redis缓存数据一致性