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

当我们 向数据库写入数据的时候 显然会和缓存中的数据造成不一致 所以会在数据库写完操作后 向缓存中更新数据 这就是双写
但是双写存在问题 假如线程1 在写数据库的时候 刚刚写完 还没来得及向缓存中同步数据 线程2 写数据库 写缓存在 线程1 之前执行完了 那么就会造成数据的不一致
解决方法 1 加锁 给写数据库操作和写缓存加锁 只有当线程1 执行完后才能执行后续线程的操作 但是加锁的性能会有影响
解决方法 2 给缓存加过期时间 超过过期时间 被删掉后 会重新去数据库读取数据 相当于做一个更新操作 这个操作会出现短期内数据不一致问题 但是保证了最终一致性 适用于数据不重要


但是还是会出现数据不一致的问题
针对于上的两种解决方案我们怎么选择? 1. 缓存的所有数据我们都加上过期时间,数据过期之后主动触发更新操作 2. 使用读写锁来处理,读读的操作是不相互影响的 无论是双写模式还是失效模式,都会导致缓存的不一致问题。即多个实例同时更新会出事。怎么办? 1. 如果是用户纬度数据(订单数据、用户数据),这种并发几率非常小,不用考虑这个问题,缓存数据加 上过期时间,每隔一段时间触发读的主动更新即可 2. 如果是菜单,商品介绍等基础数据,也可以去使用canal订阅binlog的方式。 3. 缓存数据+过期时间也足够解决大部分业务对于缓存的要求。 4. 通过加锁保证并发读写,写写的时候按顺序排好队。读读无所谓。所以适合使用读写锁。(业务不关心 脏数据,允许临时脏数据可忽略) 总结: * 我们能放入缓存的数据本就不应该是实时性、一致性要求超高的。所以缓存数据的时候加上过期时间,保证每天拿到当前最新数据即可。 * 我们不应该过度设计,增加系统的复杂性 * 遇到实时性、一致性要求高的数据,就应该查数据库,即使慢点。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!