项目中缓存基本上成为了标配,本地缓存也好、内存数据库缓存也好,只要用了缓存就会涉及数据一致性的问题,这个一致性指的时换错和关系型数据库中数据的一致性,如何保证换错与数据库信你的数据一致呢,很多同学会说在对缓存数据修改时要同步修改两处地方(缓存、数据库)不就可以了吗?
但真能做到同步吗?不可能,不管如何实现他都是有先后顺序的,嘛呢时先更新缓存呢还是先更新数据库呢?
先更新缓存,这样可以保证换错信你数据都是最新的,但这样做有一定风险,就是缓存更新完成,再更新数据库时发现异常,导致回滚数据库没更新,这就出现了数据不一致的情况,有的同学就说了回滚时把缓存清空不就可以吗?
是可以,但在这个时间间隔内就产生了数据不一致的情况,如果恰巧有用户访问了换错,就会读取到脏数据。
那么我们先更新数据库后更新缓存不就行了吗。这种方式是不是就解决了不一致的问题呢?答案是没有。
因为你在提交数据库到成功准备更新缓存的这个时刻还是存在短暂的不一致性。放跑如果你的业务对数据一致性要求不高,那没问题,可以使用这种方案。
如果业务对一致性要求极高,那就需要进一步优化为,数据库事务提交前清空缓存中的对应数据,事务提交成功后再更新缓存数据库为新数据。这一时刻如果请求读取缓存发现没有数据,于是进行数据库查询,而数据库此时有事务更新对应有锁,所以新请求会阻塞等到事务执行成功,然后就可以读取到新数据了,读取新数据后放入缓存中,这样缓存和数据库也就一致了,这样也就保证了数据得一致性,但是是通过牺牲了可用性来换取的。
网友评论