<aside> 💡 12306 项目中,缓存与数据库一致性问题的真实场景:‣
</aside>
当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致
要分两种情况看待:
<aside> 💡
一点自己的理解:
引入缓存的目的是主要是提高性能,那么必然会带来一些数据不一致的问题。
一般的业务不必追求强一致性,我们能够保证一个最终一致性即可。
因为就算我们解决了缓存数据库一致性问题,可是当我们查询好数据返回给用户,如果用户在这段时间内没有进行任何操作,后台数据也是会一直变动的,此时前后台的数据仍有可能是不一致的。
</aside>
这种情况下,如果出现了两个或多个并发请求,可能会导致写缓存和写数据库的顺序并不完全一致。例如有两个并发的写请求 A 和 B,数据库可能先被写请求 A 更新,后被写请求 B 更新,但是缓存是先被写请求 B 更新,后被写请求 A 更新,这样的话就无法保证数据的一致性。
因此,我们将「写缓存」变为「删除缓存」,回写缓存的工作交给数据库来完成,或者将写请求加锁,但是这样又会导致效率降低。
这种情况下我们考虑并发读写的问题。
假如有一个读请求和一个写请求:
总结一下,就是读请求如果发生在写请求删除缓存之后,更新数据库完成之前,那么有可能出现数据不一致问题