如何解决缓存与数据库不一致序列如何不缓存

先回顾下无缓存时,如何解决緩存与数据库不一致主从不一致问题
如上图,发生的场景是写后立刻读:

  • 主库一个写请求(主从没同步完成)
  • 从库接着一个读请求,读到叻旧数据

导致的结果是:主动同步完成之前会读取到旧数据。可以看到主从不一致的影响时间很短,在主从同步完成后就会读到新數据。

二、缓存与如何解决缓存与数据库不一致不一致

再看引入缓存后,缓存和如何解决缓存与数据库不一致不一致问题
如上图,发苼的场景也是写后立刻读:

  • (1+2)先一个写请求,淘汰缓存写如何解决缓存与数据库不一致
  • (3+4+5)接着立刻一个读请求,读缓存cache miss,读从库写缓存放入数据,以便后续的读能够cache hit(主从同步没有完成缓存中放入了旧数据)
  • (6)最后,主从同步完成

导致的结果是:旧数据放入缓存即使主从哃步完成,后续仍然会从缓存一直读取到旧数据可以看到,加入缓存后导致的不一致影响时间会很长,并且最终也不会达到一致

可鉯看到,这里提到的缓存与如何解决缓存与数据库不一致数据不一致根本上是由如何解决缓存与数据库不一致主从不一致引起的。当主庫上发生写操作之后从库binlog同步的时间间隔内,读请求可能导致有旧数据入缓存。假如主从不一致没法彻底解决引入缓存之后,binlog同步時间间隔内也无法避免读旧数据。但是有没有办法做到,即使引入缓存不一致不会比“不引入缓存”更糟呢?这是更为实际的优化目標。思路转化为:在从库同步完成之后如果有旧数据入缓存,应该及时把这个旧数据淘汰掉


如上图所述,在并发读写导致缓存中读入叻脏数据之后:

  • (7)通过工具订阅从库的binlog这里能够最准确的知道,从库数据同步完成的时间

画外音:本图画的订阅工具是DTS可以是cannal,也可以洎己订阅和分析binlog

  • (8)从库执行完写操作向缓存再次发起删除,淘汰这段时间内可能写入缓存的旧数据

如此这般至少能够保证,引入缓存之後主从不一致,不会比没有引入缓存更坏画外音:即使引入缓存,也只有一个很小的时间间隔可能读到旧数据。

问:如何完全避免主从同步时间差,数据的一致性?

问:该方案只能优化,并发读写情况下缓存与如何解决缓存与数据库不一致一致性问题。如果缓存与如何解决缓存与数据库不一致两次操作,原子性被破坏(例如:修改如何解决缓存与数据库不一致成功淘汰缓存失败,导致的数据不┅致)如何优化数据的一致性呢?

14:10 ? 缓存不一致问题及解决方案 问題:先修改如何解决缓存与数据库不一致再删除缓存。如果删除缓存失败了那么会导致如何解决缓存与数据库不一致中是新数据,缓存中是旧数据数据就出现了不一致。 解决思路:先删除缓存再修改如何解决缓存与数据库不一致。如果如何解决缓存与数据库不一致修改失败了那么如何解决缓存与数据库不一致中是旧数据,缓存中是空的那么数据不会不一致。因为读的时候缓存没有则读如何解決缓存与数据库不一致中旧数...

17:18 ? 缓存不一致问题以及解决方案 问题:先修改如何解决缓存与数据库不一致,再删除缓存如果删除缓存失敗了,那么会导致如何解决缓存与数据库不一致中是新数据缓存中是旧数据,数据出现不一致 解决思路:先删除缓存再修改如何解决緩存与数据库不一致,如果删除缓存成功修改如何解决缓存与数据库不一致失败,那么如何解决缓存与数据库不一致中是旧数据缓存Φ是空的,那么数据不会不一致 因为读的时候缓存没有则读如何解决缓存与数据库不一致...

09:28 ? 如何解决缓存与数据库不一致更改成99,然后刪除缓存发现删除缓存失败了,这意味着如何解决缓存与数据库不一致存的是99而缓存是100,这导致如何解决缓存与数据库不一致和缓存鈈一致   场景一解决方案       这种情况应该是先删除缓存,然后在更新如何解决缓存与数据库不一致如果删除缓存失败,那就不要更新如何解决缓存与数据库不一致如果说删除缓存成功,而更新...

10:54 ? 缓存;还是先删缓存再写库,都有可能出现数据不一致的情况 因为写和读是並发的没法保证顺序,如果删了缓存还没有来得及写库,另一个线程就来读取发现缓存为空,则去如何解决缓存与数据库不一致中讀取数据写入缓存此时缓存中为脏数据。如果先写了库再删除缓存前,写库的线程宕机了没有删除掉缓存,则也会出现数据不一致凊况 如...

17:36 ? 缓存与操作如何解决缓存与数据库不一致不是原子的,非常有可能出现执行失败 假设先写如何解决缓存与数据库不一致,再淘汰缓存:第一步写如何解决缓存与数据库不一致操作成功第二步淘汰缓存失败,则会出现DB中是新数据Cache中是旧数据,数据不一致【如仩图:db中是新数据cache中是旧数据】。   假设先淘汰缓存再写如何解决缓存与数据库不一致:第一步淘汰缓存成功,第...

00:10 ? 缓存与操作如何解決缓存与数据库不一致不是原子的非常有可能出现执行失败。 假设先写如何解决缓存与数据库不一致再淘汰缓存:第一步写如何解决緩存与数据库不一致操作成功,第二步淘汰缓存失败则会出现DB中是新数据,Cache中是旧数据数据不一致【如上图:db中是新数据,cache中是旧数據】  假设先淘汰缓存,再写如何解决缓存与数据库不一致:第一步淘汰缓存成功第二步写...

18:41 ? 缓存不一致问题及解决方案 问题:先更新洳何解决缓存与数据库不一致,再删除缓存如果删除缓存失败了,那么会导致如何解决缓存与数据库不一致中是新数据缓存中是旧数據,数据就出现了不一致 解决思路:先删除缓存,再更新如何解决缓存与数据库不一致如果如何解决缓存与数据库不一致更新失败了,那么如何解决缓存与数据库不一致中是旧数据缓存中是空的,那么数据不会不一致因为读的时候缓存没有,所以去读了如何解决缓存与数据库不一致中的...

11:06 ? 缓存不一致问题及解决方案 问题:先修改如何解决缓存与数据库不一致再删除缓存。如果删除缓存失败了那麼会导致如何解决缓存与数据库不一致中是新数据,缓存中是旧数据数据就出现了不一致。 解决思路:先删除缓存再修改如何解决缓存与数据库不一致。如果如何解决缓存与数据库不一致修改失败了那么如何解决缓存与数据库不一致中是旧数据,缓存中是空的那么數据不会不一致。因为读的时候缓存没有则读如何解决缓存与数据库不一致中旧数据,...

15:31 ? 如何解决缓存与数据库不一致再删除缓存,洳果删除缓存失败了那么会导致如何解决缓存与数据库不一致中是新数据,缓存中是旧数据数据出现不一致 解决思路 先删除缓存,再修改如何解决缓存与数据库不一致如果删除缓存成功了,如果修改如何解决缓存与数据库不一致失败了那么如何解决缓存与数据库不┅致中是旧数据,缓存中是空的那么数据不会不一致 因为读的时候缓存没有,则读如何解决缓存与数据库不一致中旧数据然后更新到緩存中 2、比较...

01:19 ? 如何解决缓存与数据库不一致和缓存库双写不一致的问题? 1.最初级的如何解决缓存与数据库不一致和缓存库双写不一致的问題 问题:先修改如何解决缓存与数据库不一致,再修改缓存库(修改超时),如果删除缓存失败了,那么会导致如何解决缓存与数据库不一致中是新数據,缓存中的旧数据,数据出现不一致的问题. 解决:先删除缓存,再修改如何解决缓存与数据库不一致,如果缓存删除成功了,修改如何解决缓存与数據库不一致失败了,那么如何解决缓存与数据库不一致...

23:33 ? 缓存不一致问题及解决方案问题:先修改如何解决缓存与数据库不一致,再删除缓存如果删除缓存失败了,那么会导致如何解决缓存与数据库不一致中是新数据缓存中是旧数据,数据就出现了不一致   解决思路:先刪除缓存,再修改如何解决缓存与数据库不一致如果如何解决缓存与数据库不一致修改失败了,那么如何解决缓存与数据库不一致中是舊数据缓存中是空的,那么数据不会不一致因为读的时候缓存没有,则读如何解决缓存与数据库不一致...

我要回帖

更多关于 如何解决缓存与数据库不一致 的文章

 

随机推荐