缓存与数据库闲更新哪个?
方案1:先删除缓存,然后更新数据库
在并发情况下删除缓存后,立刻读库,此时库中数据还没更新,读到老数据,又写入了缓存,导致以后所有人读到的都是缓存中的错误数据
方案2:先更新数据库,然后更新缓存
更新数据库后,还没删除缓存,导致部分人读到的是缓存中的老数据,当缓存删除后,才能从数据库读取正确数据,缓存也就正确,以后大部分人读到正确数据
两个方案无法保证原子性
关键点:不要更新缓存,而是删除缓存
缓存数据可能是很复杂的数据,拿到数据库数据之后还会进行一系列的计算,短期内用不上,达到过期时间这样就浪费io,cpu资源
更新缓存与删除缓存也存在一致性问题
删除缓存失效后的问题
1、 失效补偿,删除失败后,可以把信息打到一个补偿队列中,监听补偿队列来做补偿操作
2、 监听binlog,成熟中间件,比如canal,只要数据更新成功就一定有binlog,canal只要监听到新的binlog,说明就要删除缓存,
如果补偿队列或canal中间件挂了?用守护进程,自动拉起进程
2pc,3pc分布式协议来保证强一致性,性能就会差很多
以上说的问题,考虑点应该先从场景出发,
1、 对数据安全高的场景一定要先更新数据库,不如订单类
2、 对性能要求高的场景一定先更新缓存,不如秒杀类