在开发中我们为了提高查询效率,经常使用缓存(典型的缓存技术redis),但是在缓存的使用中我们经常遇到缓存和一致性问题(缓存的数据和数据库的数据不一致)
常见的解决方式
1.双写模式:更新数据库时候同时更新缓存
2.失效模式:更新数据的时候删除缓存
但是不管那种模式在并发情况都会有问题: 双写模式问题:在并发写的情况由于卡顿或者其他原因导致线程2线先执行完毕,线程一写入的缓存就没有线程2最新的数据,此时就出现了脏数据
失效模式问题:在写写读的情况同样会造成脏数据
问题解决办法:
1.给缓存加入过期时间,达到最终的一致性,这种解决需要能容忍一定时间的数据不一致
2.加锁达到一致,这种解决方式会导致并发降低
注意:不管是那种解决方式都会有一点瑕疵,如数据的最终一致性(短时间内数据不同),加锁降低并发
最终解决方式:如果在开发过程中为了效率必须使用缓存同时必须保证缓存的数据的一致性(强一致),可以使用Canal(阿里巴巴开源)+binlog(数据库日志),通过让Canal监听binlog的修改来保证数据的一致性。
补充:Canal在实际开发中经常用于数据的异构处理(就是不同的用户展示的数据不一致,比如:一些购物类的网站,会根据用户的访问习惯在首页推荐不同的商品)