缓存和数据库一致性
总结解决方案以及思考过程
问题描述
在分布式系统中,缓存和数据库之间的一致性问题是一个常见的问题,下面来我们来一一思考
问题分析
造成不一致的原因,从根本来看,是因为你操作数据库和缓存不是原子操作,而是两步来进行的,所以我们为了方便思考问题,直接去看第二步操作失败会导致什么问题就可以了
先更新数据库再更新缓存
更新缓存失败,缓存中留下的还是旧的数据,所以会导致缓存和数据库不一致
先更新缓存再更新数据库
更新数据库失败,数据库中留下的还是旧的数据,所以会导致缓存和数据库不一致
先更新数据库再删除缓存
删除缓存失败会导致缓存中还保留的是旧的数据,就会与数据库更新的数据不一致。有没有什么补救措施那?
删除缓存失败,可以在mq中新增一个任务来删除缓存,至于消息丢失什么的这个让mq自己来保证就可以了。
那是不是有了mq就可以完全避免缓存和数据库不一致的情况,不是的,只是大幅度减少而已
先删除缓存再更新数据库
更新数据库失败,数据库中留下的还是旧的数据,所以会导致缓存和数据库不一致
生产实际
最终一致性
可以使用延迟双删+mq来保证最终一致性
延迟双删什么?
- 删除缓存,不管这一步成功与否都去更新数据库
- 更新数据库
- 过个几百ms,再去删除缓存,为了尽可能的保证删除和缓存一致性
强一致性
用Canal监听MySQL的Binlog日志,实时捕获数据库变化并同步更新缓存,它可以最大限度的减少数据不一致的时间窗口
在分布式的场景下,就需要分布式事务来保证强一致性了,但是这种方法通常会导致性能下降,并且增加了系统的复杂度。