当前位置: 首页 > news >正文

关于缓存与数据双写一致性问题(清晰易懂)

缓存与数据双写一致性问题

一般来说,执行更新操作时,我们会有两种选择:

  • 先操作数据库,再操作缓存
  • 先操作缓存,再操作数据库

两个操作要么同时成功,要么同时失败。所以,这会演变成一个分布式事务的问题。

如果原子性被破坏,会有两种情况:

  • 操作数据库成功,操作缓存失败
  • 操作缓存成功,操作数据库失败

如果第一步已经失败了,我们直接返回Exception出去就好了,第二步根本不会执行。

先更新数据库,再更新缓存

正常情况:

  • 先操作数据库,成功
  • 在操作缓存,成功

如果原子性被破坏了:

  • 第一步操作数据库成功,第二步操作缓存失败,会导致数据库中的数据是最新的,缓存中的数据是旧数据。
  • 如果第一步操作数据库就失败了,可以直接返回错误(Exception),不会出现数据不一致。

删除缓存失败的解决策略:

  • 将要删除的key放到消息队列中
  • 自己去消费,消费失败就重试直至消费成功

先删除缓存,再更新数据库

正常情况:

  • 删除缓存成功
  • 更新数据库成功

如果原子性被破坏:

  • 第一步删除缓存成功,第二步更新数据库失败,这个没有问题,数据库中的数据和缓存中的还是一致的。
  • 第一步删除缓存失败的话,也是一样可以直接返回(Exception)错误,数据库中的数据和缓存中的还是一致的。

意外情况:

A删除缓存

B发现此时缓存没有,从数据库中读进来更新缓存

A更新了数据

此时缓存中的数据就是旧值了。

意外情况的解决策略:

  • 用消息队列,将操作都发送到消息队列中的同一个 partiion 中,保证消费消息的顺序性。
  • 在删除缓存时候,用排它读锁给这条数据锁住,等此线程更新完之后再解锁 (个人见解,因为考虑到意外情况嘛,出现的频率肯定不是很高,在这引入消息队列系统会变得很复杂)

其他保障数据一致的方案与资料

可以用 databus 或者阿里的 canal监听binlog 进行更新。

相关文章:

  • 2022 年时间序列分析最顶流的 Python 库
  • Typora入门教程
  • CSC7720
  • 编译Nginx源码(windows10及centos7)
  • Elasticsearch入门、API操作
  • Linux--进程控制
  • Python——字典
  • 机器学习必会面试知识点
  • C#基于ASP.NET的人事薪资管理系统
  • 上传项目代码到Github|Gitee
  • 中小企业OA系统的设计与实现
  • 直播弹幕系统(二)- 整合RabbitMQ进行消息广播和异步处理
  • NR RedCap UE关键技术与标准化进展
  • CARIS11.4基本使用流程及其bug
  • 我用了几行代码就实现了界面变灰效果
  • [附源码]Python计算机毕业设计Django教育企业网站
  • App 黑白化技术实践
  • 网络安全常用的工具有哪些(二)
  • 所谓工作能力强,其实就这五点
  • Linux||后续1:Ubuntu20.04安装MySQL8.0纯命令图文教程(安装+排错+可视化工具+常用命令)
  • 宁夏民政厅原厅长欧阳艳已任自治区政府副秘书长、办公厅主任
  • 宁波银行一季度净利74.17亿元增5.76%,不良率持平
  • 金融创新破局记:中小微企业转型背后的金融力量
  • 深一度|“凑合过”的利物浦,英超第二冠只求性价比
  • 我国首个核电工业操作系统发布,将在华龙一号新机组全面应用
  • 手机号旧机主信用卡欠款、新机主被催收骚扰四年,光大银行济南分行回应