数据一致性
redis缓存和mysql数据如何保持一致性?
四种策略比较:
1、先更新数据库,再更新缓存
会造成缓存和数据库数据不一致
a update mysql 100
b update mysql 80
b update redis 80
a update redis 100
mysql: 80, redis: 100
造成数据不一致,方案不可行
2、先更新缓存,再更新数据库
a update redis 100
b update redis 80
b update mysql 80
a update mysql 100
redis: 80, mysql: 100 , 造成数据不一致,方案不可行
3、先删除缓存,再更新数据库
a 删除缓存
b 来查询,因为缓存为空,去查mysql ,查的还是旧数据,回写redis
a 更新mysql
造成数据不一致,方案不可行
解决方案
延时双删策略
也就是a update mysql后再进行短暂的延迟时间后,第二次删除redis缓存。
延迟时间怎么定?
1、自己评估业务运行时,读数据和写缓存的时间t,然后延迟时间就是在t的基础上加上百毫秒
上面的方案会降低吞吐量,所以可以采用下面方案,异步线程方案
2、为了加大吞吐量,可以另起一个后台线程监控,比如:看门狗(WatchDog监控程序),mysql 更新后,给个标志位或者去主动监控mysql是否更新完成,以此来通知线程二次删除缓存
4、先更新数据库,再删除缓存
方案可行,影响不大
只会影响b在a还在更新mysql中,读取的仍然是旧值
最终一致性解决方案
阿里云中间件canal
原理
同mysql主丛同步原理一致,通过读取binlog,提取操作的数据和key