<aside> 💡 12306 项目中,缓存与数据库一致性问题的真实场景:‣

Enter your password · Yuque

</aside>

当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致

要分两种情况看待:

<aside> 💡

一点自己的理解:

引入缓存的目的是主要是提高性能,那么必然会带来一些数据不一致的问题。

一般的业务不必追求强一致性,我们能够保证一个最终一致性即可。

因为就算我们解决了缓存数据库一致性问题,可是当我们查询好数据返回给用户,如果用户在这段时间内没有进行任何操作,后台数据也是会一直变动的,此时前后台的数据仍有可能是不一致的。

</aside>

排除的技术方案

这种情况下,如果出现了两个或多个并发请求,可能会导致写缓存和写数据库的顺序并不完全一致。例如有两个并发的写请求 A 和 B,数据库可能先被写请求 A 更新,后被写请求 B 更新,但是缓存是先被写请求 B 更新,后被写请求 A 更新,这样的话就无法保证数据的一致性。

Untitled

Untitled

因此,我们将「写缓存」变为「删除缓存」,回写缓存的工作交给数据库来完成,或者将写请求加锁,但是这样又会导致效率降低。

保证最终一致性,允许短暂的不一致

先删缓存再写数据库

Untitled

这种情况下我们考虑并发读写的问题。

假如有一个读请求和一个写请求:

  1. 写请求先删除了缓存
  2. 此时读请求尝试读取数据,查询缓存为空,于是读取数据库
  3. 此时如果写请求没有完成新数据的写入,那么这个读请求就有可能得到旧数据并写入到缓存,结果就是数据的不一致

总结一下,就是读请求如果发生在写请求删除缓存之后,更新数据库完成之前,那么有可能出现数据不一致问题