数据库 缓存 数据不一致 解决方案

复制代码

 

 当我们 向数据库写入数据的时候 显然会和缓存中的数据造成不一致    所以会在数据库写完操作后  向缓存中更新数据   这就是双写

但是双写存在问题   假如线程1 在写数据库的时候 刚刚写完 还没来得及向缓存中同步数据   线程2 写数据库 写缓存在 线程1 之前执行完了   那么就会造成数据的不一致

解决方法  1  加锁  给写数据库操作和写缓存加锁 只有当线程1 执行完后才能执行后续线程的操作     但是加锁的性能会有影响

解决方法  2  给缓存加过期时间  超过过期时间  被删掉后 会重新去数据库读取数据  相当于做一个更新操作   这个操作会出现短期内数据不一致问题  但是保证了最终一致性  适用于数据不重要

复制代码
   写完数据 直接将缓存中的数据删除  然后将数据库中的数据放到缓存中去
复制代码

 

但是还是会出现数据不一致的问题


 

复制代码
针对于上的两种解决方案我们怎么选择?

1. 缓存的所有数据我们都加上过期时间,数据过期之后主动触发更新操作
2. 使用读写锁来处理,读读的操作是不相互影响的

无论是双写模式还是失效模式,都会导致缓存的不一致问题。即多个实例同时更新会出事。怎么办?

1. 如果是用户纬度数据(订单数据、用户数据),这种并发几率非常小,不用考虑这个问题,缓存数据加
   上过期时间,每隔一段时间触发读的主动更新即可
2. 如果是菜单,商品介绍等基础数据,也可以去使用canal订阅binlog的方式。
3. 缓存数据+过期时间也足够解决大部分业务对于缓存的要求。
4. 通过加锁保证并发读写,写写的时候按顺序排好队。读读无所谓。所以适合使用读写锁。(业务不关心
   脏数据,允许临时脏数据可忽略)

总结:

* 我们能放入缓存的数据本就不应该是实时性、一致性要求超高的。所以缓存数据的时候加上过期时间,保证每天拿到当前最新数据即可。
* 我们不应该过度设计,增加系统的复杂性
* 遇到实时性、一致性要求高的数据,就应该查数据库,即使慢点。
复制代码

 

 

复制代码

 

 

 

posted @   花心大萝卜li  阅读(911)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示