掘地三尺搞定 Redis 与 MySQL 数据一致性问题
若有收获,请记得分享和转发哦
Redis 拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求,
把 Redis 作为缓存组件,需要防止出现以下的一些问题,否则可能会造成生产事故。
Redis 缓存满了怎么办?
缓存穿透、缓存击穿、缓存雪崩如何解决?
Redis 数据过期了会被立马删除么?
Redis 突然变慢了如何做性能排查并解决?
Redis 与 MySQL 数据一致性问题怎么应对?
今天跟大家一起深入探索缓存的工作机制和缓存一致性应对方案。
在本文正式开始之前,我觉得我们需要先取得以下两点的共识:
缓存必须要有过期时间;
保证数据库跟缓存的最终一致性即可,不必追求强一致性。
目录如下:
1. 什么是数据库与缓存一致性
2. 缓存的使用策略
2.1 Cache-Aside (旁路缓存)
2.2 Read-Through(直读)
2.3 Write-Through 同步直写
2.4 Write-Behind
3. 旁路缓存下的一致性问题分析
3.1 先更新缓存,再更新数据库
3.2 先更新数据库,再更新缓存
3.3 先删缓存,再更新数据库
3.4 先更新数据库,再删缓存
4. 一致性解决方案有哪些?
4.1 缓存延时双删
4.2 删除缓存重试机制
4.3 读取 binlog 异步删除
总结
按照前面说的套路,假设第一个操作成功,第二个操作失败推断下会发生什么?高并发场景下又会发生什么?
第二步写数据库失败
假设现在有两个请求:写请求 A,读请求 B。
写请求 A 第一步先删除缓存成功,写数据到数据库失败,就会导致该次写数据丢失,数据库保存的是旧值。
接着另一个读请 B 求进来,发现缓存不存在,从数据库读取旧数据并写到缓存中。
高并发下的问题
先删缓存,再写数据库
掘地三尺搞定 Redis 与 MySQL 数据一致性问题相关推荐
- 搞机:使用docker-compose10分钟搞定redis,mongodb,mysql三大数据库
redis,mongodb,mysql三大数据库应该算是后端最为常用的三种数据库了,部署后端服务的时候一个一个的安装过于麻烦,这里我们结合docker的使用实现快速安装,并使用docker-compo ...
- 搞定 Redis 数据存储原理,别只会 set、get 了
在上一篇通过源码编译构建出可调式环境之后,想必你想更深入了解我的整体架构.当你熟悉我的整体架构和每个模块,遇到问题才能直击本源,直捣黄龙,一笑破苍穹. 我的核心模块如图 1-10. 图1-10 图 1 ...
- 一文搞定Redis五大数据类型及使用场景
作者 | 周明尧 来源 | Java旅途(ID:Javatrip) 头图 | CSDN 下载自东方IC Redis 是一种基于键值对的NoSQL数据库,它的值主要由string(字符串),hash( ...
- liunx上mysql源码安装mysql,搞定linux上MySQL编程(一):linux上源码安装MySQL
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 1. 首先下载源码包: ftp://ftp.jaist.ac.jp/pub/m ...
- redis中有key但是删不掉_一篇图文,搞定Redis事务
在面试的时候,通常会被问到redis是如何实现分布式锁的.如果我们只知道是借助于setnx/setex ,而不了解setnx/setex底层如何实现,那基本上是无法过关的,尤其是大厂.那究竟redis ...
- mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎
MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...
- Python入门系列(十一)一篇搞定python操作MySQL数据库
开始 安装MySQL驱动 $ python -m pip install mysql-connector-python 测试MySQL连接器 import mysql.connector 测试MySQ ...
- 搞定Redis高级特性与性能调优
阅读文本大概需要15分钟. 本文适合使用 Redis 的普通开发人员,以及对 Redis 进行选型.架构设计和性能调优的架构设计人员: Redis 的数据结构和相关常用命令 数据持久化 内存管理与数据 ...
- redis mysql原理_Canal(redis与mysql数据一致性)
canal实现原理 1.canal server端会伪装成mysql从节点,去读取mysql主节点binlog文件,实现增量同步 2.canal server端将数据以json格式同步到客户端,MQ消 ...
最新文章
- php使用workerman实战,使用workerman实现在线聊天的方法
- 张宏江:人工智能的长远发展需要有人坐冷板凳
- 服务器比普通电脑响应速度快吗,云服务器比普通的快吗
- 从原型链看DOM--Node类型
- 【Tiny4412】Tiny4412烧写uboot脚本分析
- 学习随笔:Django 补充及常见Web攻击 和 ueditor
- mysql 自动化部署,MySQL标准化、自动化部署
- 前端为什么要工程化?
- nowcoderG 小国的复仇
- MySQL配置优化选项
- 董耀祖:云原生是趋势,多云、边缘云也变得很热
- 微信淘宝客小程序开发多多客京东客六合一系统外卖cps返利源码
- 云服务器保存文件,云服务器保存文件命令
- Android基于opencv4.6.0实现人脸识别功能
- 11.计算机基础之计算机网络基础
- throw java_THROW,JAVA的throw和throws怎么用!
- 【优秀毕设V2.0】基于树莓派的OpenCV-Python摄像头人脸追踪及手势识别、网络地址推流及远程控制系统(多功能系统、含演示视频)
- 心动C++情牵汉洛塔
- Auto.js学习笔记2:真机连接vscode开发工具进行调试,自动开启微信app,自动切换通讯录和微信界面
- JavaScript mongodb(数据库)简单值