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

【Redis】Redis做为缓存,MySQL如何与Redis保持数据一致

Redis的作用

一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层,主要目的是减少数据库的io,还可以提升数据库io性能

方法一:

先更新MySQL数据库,再删除缓存,再从数据库查询到的最新的数据同步到redis。采用最终一致性性策略。

缺点:相较于mq的方式,这种方式由于要查数据库并将最新数据写到redis,可能会造成接口响应速度变慢。

方法二:

更新mysql数据库,再采用mq异步的方式,将数据同步到redis中。

缺点:数据同步延时概率比较大,数据库的更改信息投递到mq中,消费者可能没来得及消费消息同步数据到redis。

优点:异步解耦

方法三:

基于订阅mysql binlog,采用mq异步的形式将数据同步到redis(canal框架)。

将mysql以主从的方式部署,主库负责写,从库负责读,当主库的binlog日志文件发生改变时,将信息同步到从库,从库执行对应的sql,保证主从一致性。

canalServer端,伪装成mysql的从节点,订阅mysql主节点的binlog文件,当主节点的binlog发生变化时,会将binlog日志文件发送给canalServer端,自己创建的处理程序连接到canalServer端,将数据同步到redis。

优点:手动直接更改数据库也会自动同步到redis。

方法四:

延时双删策略(不推荐)

  • 先删缓存,在更新mysql并同步到redis,在高并发的情况下,第一个线程还没来得及更新mysql时,其他线程读取到的缓存可能为null值,将mysql旧的数据同步到redis中了。

解决办法:延时删除,在t1线程更新数据库之后,sleep一段时间再去删除缓存。

缺点:t1线程延时多少秒再去删除缓存中的key?难以控制,得根据业务逻辑的执行时间和写缓存的时间来进行估算。

补充:什么是双写一致性协议?

先更新数据库,在更新缓存。

updateDB();
updateredis();

多个线程同步修改mysql和redis时,由于mysql行锁机制,多个线程同时修改同一行数据,只能有一个线程修改成功,两个线程更新完数据库后同时更新redis,由于不能确保两个线程更新缓存的先后顺序,可能会造成数据库和缓存的不一致性。

解决办法:使用事务保证更新数据库和更新缓存整个两个操作的原子性。

相关文章:

  • 浮点型数字
  • 使用Visual Studio调试排查Windows系统程序audiodg.exe频繁弹出报错
  • ip地址可以精确定位吗
  • 洗衣行业在线预约小程序系统源码搭建 支持直播功能+在线预约下单+上门取件
  • go mod tidy 报错:x509: certificate signed by unknown authority 最佳实践
  • sentinel-dashboard-1.8.0.jar开机自启动脚本
  • 文件内容显示
  • 常用音频接口:TDM,PDM,I2S,PCM
  • .NET的键盘Hook管理类,用于禁用键盘输入和切换
  • 使用Python做一个微信机器人
  • Azure AD混合部署,通过 Intune 管理设备,实现条件访问
  • 8.6 枚举类型
  • Python15题day13
  • 爬虫为什么需要 HTTP 代理 IP?
  • 学习资源汇集
  • 找不到名称 “$“。是否需要安装 jQuery 的类型定义? 请尝试使用 `npm i --save-dev @types/jquery`。
  • PyCharm中使用pyqt5的方法2-2
  • Doris 2.0.1 Dockerfile制作
  • 【Java】数组的深浅拷贝问题(二维数组举例)(136)
  • SQL 如何提取多级分类目录
  • “明制美学”的舞台呈现,陆川导演首部舞剧《天工开物》
  • 建投读书会·东西汇流|西风东渐中的上海营造
  • 解读丨连续两日施压,特朗普为何着急让美联储降息
  • 市场监管总局:在全国集中开展食用植物油突出问题排查整治
  • 鲁比奥在法国只字不提关税,美国威胁下欧盟勉力维持统一战线
  • 谁在地铁里阅读?——对话上海地铁上的读书人