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

Redis 和 Mysql 如何保证数据一致性

(mic老师面试文档摘选)
今天分享一道一线互联网公司高频面试题。
“Redis 和 Mysql 如何保证数据一致性”。
这个问题难倒了不少工作 5 年以上的程序员,难的不是问题本身,而是解决这个问题的思维模式。
下面来看看普通人和高手对于这个问题的回答。
普通人
嗯....
Redis 和 Mysql 的数据一致性保证是吧?我想想。
嗯 , 就是,Mysql 的数据发生变化以后,可以同步修改 Redis 里面的数据。
高手
一般情况下,Redis 用来实现应用和数据库之间读操作的缓存层,主要目的是减少数据库 IO,还可以提升数据的 IO 性能。
这是它的整体架构。
当应用程序需要去读取某个数据的时候,首先会先尝试去 Redis 里面加载,如果命中就直接返回。如果没有命中,就从数据库查询,查询到数据后再把这个数据缓存到 Redis里面。
(如图)在这样一个架构中,会出现一个问题,就是一份数据,同时保存在数据库和 Redis 里面,当数据发生变化的时候,需要同时更新 Redis 和 Mysql,由于更新是有先后顺序的,并且它不像 Mysql 中的多表事务操作,可以满足 ACID 特性。所以就会出 现数据一致性问题
在这种情况下,能够选择的方法只有几种。
1. 先更新数据库,再更新缓存
2. 先删除缓存,再更新数据库
如果先更新数据库,再更新缓存,如果缓存更新失败,就会导致数据库和 Redis 中的数据不一致
如果是先删除缓存,再更新数据库,理想情况是应用下次访问 Redis 的时候,发现 Redis
里面的数据是空的,就从数据库加载保存到 Redis 里面,那么数据是一致的。但是在极
端情况下,由于删除 Redis 和更新数据库这两个操作并不是原子的,所以这个过程如果
有其他线程来访问,还是会存在数据不一致问题。
所以,如果需要在极端情况下仍然保证 Redis 和 Mysql 的数据一致性,就只能采用最
终一致性方案。
(如图)比如基于 RocketMQ 的可靠性消息通信,来实现最终一致性。
(如图)还可以直接通过 Canal 组件,监控 Mysql 中 binlog 的日志,把更新后的数据
同步到 Redis 里面。
因为这里是基于最终一致性来实现的,如果业务场景不能接受数据的短期不一致性,那
就不能使用这个方案来做。
以上就是我对这个问题的理解。
结尾 在面试的时候,面试官喜欢问各种没有场景化的纯粹的技术问题,比如说:“你这个最
终一致性方案”还是会存在数据不一致的问题啊?那怎么解决?
先不用慌,技术是为业务服务的,所以不同的业务场景,对于技术的选择和方案的设计
都是不同的,所以这个时候,可以反问面试官,具体的业务场景是什么?
一定要知道的是,一个技术方案不可能 cover 住所有的场景,明白了吗?
好的,好的,本期的普通人 VS 高手面试系列的视频就到这里结束了,喜欢的朋友记得
点赞收藏。
另外,最近从评论区收到的面试问题,都有点太泛了,比如:说一下 mongoDB 啊,
说一下 kafka 啊、说一下并发啊,这些问题都是要几个小时才能彻底说清楚,建议大家
提具体一点的问题。

相关文章:

  • 假冒 Skype 应用程序网络钓鱼分析
  • C语言--每日五道选择题--Day6
  • WPF ToggleButton 主题切换动画按钮
  • TensorRT安装部署指南(Windows10)
  • 采集Prestashop独立站采集Prestashop独立站
  • 【数据结构】树与二叉树(十一):二叉树的层次遍历(算法LevelOrder)
  • S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)
  • 多个微信快速同步发圈
  • 每日一练:Python中如何使用enumerate 函数创建带索引的元组
  • 什么是Ribbon的饥饿加载?有什么优势?
  • LeetCode_线段树_中等_307.区域和检索 - 数组可修改
  • 【PG】PostgreSQL 目录结构
  • 向量的范数、矩阵的范数
  • Apipost IDEA插件如何使用
  • keep-alive缓存,三级路由不生效
  • 30天自制操作系统-2
  • android 一些 utils
  • GitUp, 你不可错过的秀外慧中的git工具
  • JavaScript 奇技淫巧
  • Linux各目录及每个目录的详细介绍
  • QQ浏览器x5内核的兼容性问题
  • Vue实战(四)登录/注册页的实现
  • 大主子表关联的性能优化方法
  • 翻译--Thinking in React
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 简单易用的leetcode开发测试工具(npm)
  • 简析gRPC client 连接管理
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 微服务入门【系列视频课程】
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • %check_box% in rails :coditions={:has_many , :through}
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Oracle存储过程编写经验和优化措施
  • (转)程序员疫苗:代码注入
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .libPaths()设置包加载目录
  • .Net 6.0 处理跨域的方式
  • .NET Core引入性能分析引导优化
  • .net Stream篇(六)
  • .Net多线程总结
  • .NET委托:一个关于C#的睡前故事
  • .Net中间语言BeforeFieldInit
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [BIZ] - 1.金融交易系统特点
  • [bzoj1912]异象石(set)
  • [bzoj4240] 有趣的家庭菜园
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [GXYCTF2019]BabyUpload1 -- 题目分析与详解
  • [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]
  • [IE编程] 如何获得IE版本号