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

如何保证mysql和redis的数据一致性

保证 MySQL 和 Redis 的数据一致性是分布式系统中常见的挑战,因为 Redis 作为缓存层,可能存在与底层数据库数据不一致的情况。以下是几种常用的方案及其优缺点对比:


1. 缓存更新策略

(1) Cache-Aside Pattern(旁路缓存模式)

核心思想:应用程序直接管理缓存和数据库的读写。
流程

  • 读操作
    1. 先查 Redis,命中则返回。
    2. 未命中则查 MySQL,并将结果写入 Redis。
  • 写操作
    1. 先更新 MySQL。
    2. 删除 Redis 中的缓存(下次读取时重新加载)。

优点

  • 实现简单,适合读多写少场景。
  • 减少缓存与数据库的强耦合。

缺点

  • 短暂不一致:在 MySQL 更新后、Redis 删除前,可能读到旧数据。
  • 缓存穿透风险:如果数据不存在,频繁查询会打到数据库(可通过缓存空值解决)。

(2) Write-Through(直写模式)

核心思想:所有写操作同时更新 Redis 和 MySQL。
流程

  • 写操作
    1. 先更新 Redis。
    2. 同步更新 MySQL(通常在一个事务中完成)。

优点

  • 强一致性,数据几乎实时同步。

缺点

  • 写入性能较低(每次写都要操作缓存和数据库)。
  • 不适合写多读少场景。

(3) Write-Behind(异步写回)

核心思想:先更新 Redis,再异步批量更新 MySQL。
流程

  1. 写操作直接更新 Redis。
  2. 通过消息队列或定时任务异步同步到 MySQL。

优点

  • 写入性能高(Redis 响应快,MySQL 异步处理)。

缺点

  • 数据丢失风险:如果 Redis 宕机,未同步的数据会丢失。
  • 一致性较弱(最终一致性)。

2. 数据同步方案

(1) 基于 Binlog 的异步同步(如 Canal + MQ)

核心思想:通过 MySQL 的 Binlog 监听数据变更,触发 Redis 更新。
流程

  1. Canal 监听 MySQL Binlog。
  2. 解析 Binlog 后,通过 MQ(如 Kafka/RabbitMQ) 发送变更事件。
  3. 消费者服务更新 Redis。

优点

  • 解耦业务代码,可靠性高。
  • 支持异构系统同步。

缺点

  • 架构复杂,需要维护 Canal 和 MQ。
  • 延迟稍高(毫秒级)。

(2) 延迟双删策略

核心思想:在更新 MySQL 前后各删除一次缓存,确保最终一致性。
流程

  1. 删除 Redis 缓存。
  2. 更新 MySQL。
  3. 延迟一段时间(如 500ms)后,再次删除 Redis(防止期间其他请求写入旧数据)。

优点

  • 减少不一致时间窗口。

缺点

  • 延迟时间难以精确设定。
  • 仍可能存在短暂不一致。

3. 分布式锁保证强一致

核心思想:在关键操作(如缓存更新)上加锁,避免并发冲突。
流程

  1. 写操作前获取分布式锁(如 Redis 的 SETNX 或 ZooKeeper)。
  2. 更新 MySQL 并删除缓存。
  3. 释放锁。

优点

  • 强一致性(但性能较低)。

缺点

  • 锁竞争可能成为性能瓶颈。
  • 复杂度高,需处理锁超时等问题。

4. 最终一致性方案(TCC/Saga)

核心思想:通过事务补偿机制保证最终一致性。
适用场景:分布式事务场景(如订单支付)。
流程

  1. Try:预留资源(如冻结库存)。
  2. Confirm:提交事务(更新 MySQL 并清理 Redis)。
  3. Cancel:失败时回滚(恢复数据)。

优点

  • 适合复杂业务逻辑。

缺点

  • 实现复杂,需设计补偿逻辑。

方案对比总结

方案一致性强度性能复杂度适用场景
Cache-Aside读多写少(如商品详情)
Write-Through写少读多,强一致性需求
Write-Behind最终写多读少(如计数统计)
Binlog + MQ最终异构系统同步
延迟双删最终短暂不一致可容忍场景
分布式锁金融等高一致性场景

最佳实践建议

  1. 读多写少:优先用 Cache-Aside + 延迟双删
  2. 写多读少:考虑 Write-Behind 或直接禁用缓存。
  3. 强一致性:结合 分布式锁TCC 事务
  4. 解耦需求:使用 Binlog 监听(如 Canal)。

通过合理选择策略,可以在性能和数据一致性之间取得平衡。

相关文章:

如何保证mysql和redis的数据一致性

保证 MySQL 和 Redis 的数据一致性是分布式系统中常见的挑战,因为 Redis 作为缓存层,可能存在与底层数据库数据不一致的情况。以下是几种常用的方案及其优缺点对比: 1. 缓存更新策略 (1) Cache-Aside Pattern(旁路缓存模式&#…...

Java学习——day23(反射的对象创建与方法调用)

文章目录 1. 使用反射实例化对象1.1 利用无参构造函数创建对象1.2利用带参构造函数创建对象 2.通过反射调用对象方法2.1 调用公共方法2.2 调用私有方法(需设置访问权限)3. 访问和修改对象的属性3.1 公共属性3.2 私有属性 4. 实践任务4.1工厂类 SimpleFac…...

遇到无法连接香港服务器可能是什么原因导致的呢

遇到无法连接香港服务器的情况时,别急着重启或联系客服,先搞清楚到底是哪里断了链条。问题可能出在服务器本身,也可能是你的本地网络、路由路径、DNS、甚至运营商的“干预”。以下是常见的几个可能原因,建议你可以逐一排查&#x…...

Python----计算机视觉处理(Opencv:道路检测完整版:透视变换,提取车道线,车道线拟合,车道线显示,)

Python----计算机视觉处理(Opencv:道路检测之道路透视变换) Python----计算机视觉处理(Opencv:道路检测之提取车道线) Python----计算机视觉处理(Opencv:道路检测之车道线拟合) Python----计算机视觉处理&#xff0…...

javaweb自用笔记:Maven分模块设计与开发、Maven继承与聚合、Maven私服

Maven分模块设计与开发 Maven继承与聚合 继承 版本锁定 dependencies引入依赖,dependencyManagement不代表依赖被引入,如果要使用dependencyManagement下的依赖,还需要在dependencies里面定义 聚合 如果没有用聚合,将这个项目打…...

在PyCharm中出现 **全角字符与非英文符号混合输入** 的问题

在PyCharm中出现 全角字符与非英文符号混合输入 的问题(如 124345dfs$¥cvd)&#xff0…...

数字身份DID协议:如何用Solidity编写去中心化身份合约

本文提出基于以太坊的自主主权身份(SSI)实现方案,通过扩展ERC-734/ERC-735标准构建链上身份核心合约,支持可验证声明、多密钥轮换、属性隐私保护等特性。设计的三层架构体系将身份控制逻辑与数据存储分离,在测试网环境…...

Linux的RPM包管理详解

Linux的RPM包管理详解 引言 RPM(Red Hat Package Manager)是Linux系统中一种重要的软件包管理工具,它以“.rpm”为扩展名,广泛应用于基于Red Hat的Linux发行版,如CentOS、Fedora、openSUSE等。RPM包不仅简化了软件包…...

其它理论原则

ABC理论 假设(Assumption)影响行为(Behavior),行为最终影响结果(Consequence)。 如果产品经理认为同事是一个不讲道理的人,那么产品经理在和他交流时就会产生抵触的行为&#xff0c…...

C++中的类和对象(上)

1 类的定义 1.1 类定义的格式 1 class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省 略》。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数…...

LLaMA-Factory 数据集成从入门到精通

一、框架概述 LLaMA-Factory 框架通过Alpaca/Sharegpt双格式体系实现多任务适配,其中Alpaca专注结构化指令微调(含SFT/DPO/预训练),Sharegpt支持多角色对话及多模态数据集成。核心配置依托 dataset_info.json 实现数据源映射、格…...

高级:JVM面试题深度剖析

一、引言 在Java技术面试中,JVM(Java虚拟机)相关知识是考察重点之一。深入理解JVM的内存模型、垃圾回收机制、类加载机制等,不仅能帮助开发者优化Java应用性能,还能在面试中展现深厚的技术功底。本文将针对这些高频知…...

Spring MVC 中 @ResponseBody 注解深度使用教程

一、注解核心作用 ResponseBody 是 Spring MVC 中处理 响应体内容 的核心注解,主要功能: 跳过视图解析器:直接返回数据而非视图名称自动数据转换:根据返回值类型自动转换响应格式(JSON/XML/纯文本)RESTfu…...

数据结构第一轮复习--第七章查找(包含课程代码)

基于数组实现顺序查找代码 //顺序查找的实现 typedef struct{ //查找表的数据结构(顺序表) ElemType *elem; //指向开辟的动态数组基址 (起始地址) int TableLen; //表的长度 }SSTable; //顺序查找 int Search_Seq(SSTable ST…...

Springboot JPA 集成ShardingSphere

Spring Boot集成JPA与ShardingSphere可通过以下步骤实现分库分表功能&#xff0c;需重点关注依赖配置、分片规则定义及JPA适配问题&#xff1a; 一、依赖配置 1‌. 引入核心依赖‌ 在pom.xml中添加ShardingSphere和JPA相关依赖&#xff1a; <!-- ShardingSphere JDBC --&…...

详细介绍javaspringboot操控redis的高级特性1. 事务支持2. 发布/订阅3. Pipeline批量操作

Spring Boot 对 Redis 的操作提供了丰富的高级特性&#xff0c;以下是对事务支持、发布 / 订阅、Pipeline 批量操作的详细介绍&#xff1a; 事务支持 原理&#xff1a;Redis 事务是一个单独的隔离操作&#xff0c;它可以包含多个命令&#xff0c;这些命令要么全部执行&#x…...

第一次3D打印,一个简单的小方块(Rhino)

一、建模 打开犀牛&#xff0c;我们选择立方体 我们点击上册的中心点 输入0&#xff0c;然后回车0 而后我们输长度&#xff1a;10&#xff0c;回车确认 同样的&#xff0c;宽度10 高度同样是10 回车确认后&#xff0c;我们得到一个正方形 二、导出模型 我们选择文件—>保存…...

数据分享:汽车测评数据

说明&#xff1a;如需数据可以直接到文章最后关注获取。 1.数据背景 Car Evaluation汽车测评数据集是一个经典的机器学习数据集&#xff0c;最初由 Marko Bohanec 和 Blaz Zupan 创建&#xff0c;并在 1997 年发表于论文 "Classifier learning from examples: Common …...

硬盘分区格式之GPT(GUID Partition Table)笔记250406

硬盘分区格式之GPT&#xff08;GUID Partition Table&#xff09;笔记250406 GPT&#xff08;GUID Partition Table&#xff09;硬盘分区格式详解 GPT&#xff08;GUID Partition Table&#xff09;是替代传统 MBR 的现代分区方案&#xff0c;专为 UEFI&#xff08;统一可扩展固…...

辉视智慧医院:以科技温度 重塑医疗未来新生态

大家是否想过&#xff0c;医院里的广播对讲系统也能变身‘智慧管家’&#xff1f;今天带您走进辉视智慧医院&#xff0c;看看他们如何用四大黑科技&#xff0c;让医患沟通更暖心、更高效&#xff01; 一、物联网技术&#xff1a;医疗设备‘开口说话’&#xff0c;广播系统秒变‘…...

Google 发布 Sec-Gemini v1:用 AI 重塑网络安全防御格局?

在网络威胁日益复杂化、自动化程度不断提高的今天&#xff0c;防御方常常感到力不从心。为了扭转这一局面&#xff0c;Google 近日迈出了重要一步&#xff0c;宣布推出专为网络安全领域量身打造的实验性 AI 模型——Sec-Gemini v1。该模型由 Google 内部的 Sec-Gemini 团队成员…...

Android 使用ninja加速编译的方法

ninja的简介 随着Android版本的更迭&#xff0c;makefile体系逐渐增多&#xff0c;导致make单编模块的时间越来越长&#xff0c;每次都需要半个小时甚至更长时间&#xff0c;其原因为每次make都会重新加载所有mk文件&#xff0c;再生成ninja编译&#xff0c;此完整过程十分耗时…...

windterm终端软件使用

windterm终端软件使用 下载安装包&#xff1a;https://github.com/kingToolbox/WindTerm/releases ssh连接&#xff1a; 可以复用vscode连接ssh信息 onekey 相当于服务器主机的用户名和密码 点击配置标签如Linux&#xff0c;输入用户名如root, identity file指定本地公钥&a…...

《操作系统真象还原》第六章——完善内核

文章目录 [toc]前言调用约定和混合编程调用约定混合编程 实现打印函数print.S显卡的端口控制实现单个字符打印put_char定义数据类型put_char编码修改内核main.c验证put_char 实现字符串打印put_str 结语 前言 学完上一章后&#xff0c;我们已经完成了一个操作系统最基本的三个…...

上海餐饮市场数据分析与可视化

上海作为中国的经济中心和国际化大都市,其餐饮市场具有高度的多样性和竞争性。随着消费者需求的不断变化,餐饮行业的从业者和投资者需要深入了解市场现状和趋势,以便制定更有效的商业策略。本文将通过数据分析和可视化技术,深入探讨上海餐饮市场的现状和趋势,为餐饮从业者…...

不花钱也能玩GPT-4o,国内可用

家人们&#xff01;最近GPT-4o生图功能真的离谱到不真实&#xff0c;各种吉卜力、宫崎骏、3D风格等刷爆小红书。 由于只有GPT官网&#xff0c;只有Plus用户才能用&#xff0c;很多小伙伴们都没有机会体验过GPT&#xff0c;本期就分享一个国内也能直接玩的方法。 第一步&#x…...

ResNet改进(22):提升特征选择能力的卷积神经网络SKNet

在计算机视觉领域,残差网络(ResNet)一直是图像分类任务中的经典架构。本文将介绍一种改进版的ResNet18,它融合了选择性核(SK)机制,能够自适应地调整不同感受野的特征权重,从而提升模型性能。下面我们将详细解析这个实现代码。 一、代码概述 这个Python脚本实现了一个带有S…...

实战代码:esp32-cam按钮控制手机拍照V1.0

#include <WiFi.h> #include <HTTPClient.h> // WiFi设置 const char* ssid “MIFI-020806-2.4G”; const char* password “12345678”; // 静态IP配置 IPAddress staticIP(192, 168, 1, 32); // 设置为固定IP IPAddress gateway(192, 168, 1, 1); // 网关地址…...

Base64是密码吗?编码与加密的本质区别

&#xff08;本文完全由deepseek生成&#xff0c;特此声明&#xff01;&#xff09;‌ 引言&#xff1a;一个让开发者“翻车”的经典误区‌ 我们常看到类似这样的提问&#xff1a; “我用Base64加密了用户的密码&#xff0c;为什么还是被黑客破解了&#xff1f;” “Base64解…...

原理图输出网表及调入

一、输出网表操作步骤 &#xff08;1&#xff09;选中.dsn文件&#xff0c;选者N或进入tools下拉列表选择Creat Netlists &#xff08;2&#xff09;导出网表后的文件 二、网表的导入 &#xff08;1&#xff09;执行菜单命令“File-Import-Logic/netlist”&#xff0c;将原理…...

C++ 模板的应用——智能指针、STL库

#include "head.h" #include <stdio.h> using namespace std;void registerUser(vector<string>& number,vector<string>& passwd){string username;string Passwd;cout << "请输入账号:" << endl;cin >> use…...

基于层次建模与交叉注意力融合的医学视觉问答系统(HiCA-VQA)详解

论文地址:https://arxiv.org/pdf/2504.03135 一、论文结构概述 这篇论文提出了一种针对医学视觉问答(Medical Visual Question Answering, Med-VQA)的层次化建模框架 ​HiCA-VQA,旨在解决现有方法在层次化语义建模和跨模态融合上的不足。以下是论文的核心结构: ​引言 介…...

比较与分析敏捷开发方法:XP、Scrum、FDD等的特点与适用场景

目录 前言1. 极限编程 (XP)1.1 极限编程的核心特点1.2 极限编程的适用场景 2. Scrum2.1 Scrum的核心特点2.2 Scrum的适用场景 3. 水晶方法 (Crystal)3.1 水晶方法的核心特点3.2 水晶方法的适用场景 4. 特征驱动开发 (FDD)4.1 特征驱动开发的核心特点4.2 特征驱动开发的适用场景…...

ICMP 协议深度解析

ICMP 协议深度解析 一、协议定位与核心作用 ICMP&#xff08;互联网控制报文协议&#xff09;是IP协议体系的"哨兵系统"&#xff0c;专用于网络状态监控与异常反馈。其核心价值体现在&#xff1a; 轻量级控制&#xff1a;仅传递关键状态信息&#xff0c;不承载业务…...

C语言基础20

内容提要 预处理 库文件 预处理 C语言编译步骤 预处理 编译 汇编 链接 什么是预处理 预处理就是在源文件&#xff08;.c文件&#xff09;编译之前&#xff0c;所进行的一部分预备操作&#xff0c;这部分操作是由预处理程序自动完成。当源文件在编译时&#xff0c;编译…...

conda常用命令

要查看使用conda创建的虚拟环境&#xff0c;可以按照以下步骤操作&#xff1a; 打开终端或命令行工具&#xff1a;确保你已经打开了终端或命令行界面&#xff0c;以便输入conda命令。 输入命令查看环境列表&#xff1a; 使用以下任一命令查看conda创建的虚拟环境&#xff1a…...

Ubunut18.04 离线安装MySQL 5.7.35

一、环境准备 1.1 官方下载MySQL5.7.35 完整包 1.2 上传包 & 解压 上传包名称是&#xff1a;mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle.tar # 切换到上传目录 cd /home/MySQL # 解压&#xff1a; tar -xvf mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle…...

地图与图层操作

地图文档本质上就是存储在磁盘上的地图&#xff0c;包括地理数据、图名、图例等一系列要素&#xff0c;当完成地图制作、图层要素标注及符号显示设置后&#xff0c;可以将其作为图层文件保存到磁盘中&#xff0c;在一个图层文件中&#xff0c;包括了定义如何在地图上描述地理数…...

红宝书第三十一讲:通俗易懂的包管理器指南:npm 与 Yarn

红宝书第三十一讲&#xff1a;通俗易懂的包管理器指南&#xff1a;npm 与 Yarn 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、基础概念 包管理器&#xff1a;帮你自动下载和管理第三方代码库&#xff08;如…...

李建忠:智能体正将互联网从信息网络重构为行动网络

引言 模型正在从训练为主转换为推理为主的新范式&#xff0c;智能体正将互联网从信息网络重构为行动网络&#xff0c;我们正处在从人类使用互联网到 AI 代理使用互联网的转折点。这不是未来&#xff0c;而是此刻已经发生的颠覆。 3 月 22 日&#xff0c;在腾讯云架构师技术同…...

瑞芯微AI处理器详解

瑞芯微&#xff08;Rockchip&#xff09;的芯片产品线覆盖从低功耗MCU到高性能AIoT处理器&#xff0c;以下是其主流芯片系列及RK3568的市场定位分析&#xff1a; 一、瑞芯微主要芯片系列 旗舰级 RK3588&#xff1a;12nm工艺&#xff0c;4A764A55&#xff0c;6TOPS NPU&#xff…...

Compose Multiplatform+Kotlin Multiplatfrom 第五弹跨平台

截图功能 Compose MultiplatformKotlin Multiplatfrom下实现桌面端的截图功能&#xff0c;起码搞了两星期&#xff0c;最后终于做出来了&#xff0c;操作都很流畅&#xff0c;截取的文件大小也正常&#xff0c;可参考支持讨论&#xff01; 功能效果 代码实现 //在jvmMain下创…...

linux安装ollama

俩种方式都可 一、linux通过docker安装ollama镜像 1.下载安装ollama镜像 # 安装 Docker sudo yum install docker sudo systemctl start docker#docker查看所有容器 docker ps -a # 查看所有容器# docker查看指定容器 docker ps -a |grep ollama# 创建模型存储目录&#xff…...

113. 在 Vue 3 中使用 OpenLayers 实现鼠标移动显示坐标信息

✨ 写在前面 在地图类项目开发中&#xff0c;一个常见需求就是&#xff1a;实时获取用户鼠标在地图上的经纬度坐标&#xff0c;并展示在地图上。 本文将通过一个简单的案例&#xff0c;手把手带大家在 Vue 3 项目中集成 OpenLayers 地图库&#xff0c;并实现以下功能&#xf…...

跳跃游戏的最优解法——贪心算法的智慧与实践

跳跃游戏的最优解法——贪心算法的智慧与实践 跳跃游戏是一类经典的算法题&#xff0c;既有趣又充满挑战&#xff0c;不仅能锻炼思维能力&#xff0c;还能直观展现贪心算法的核心思想。今天&#xff0c;我们从题目入手&#xff0c;拆解贪心算法的原理&#xff0c;用通俗易懂的…...

搭建docker registry私服,并且支持https推送

搭建docker registry私服&#xff0c;并且支持https推送 一、为什么写这篇文章二、搭建过程三、验证 一、为什么写这篇文章 网上关于搭建docker registry的文章一大把&#xff0c;但是都是配置为http方式推送&#xff0c;且需要显示端口&#xff0c;这个在真正项目使用中&…...

UniApp Vue 3 中的网络请求封装及用法

在UniApp中&#xff0c;结合Vue 3的强大特性&#xff0c;进行网络请求的封装是项目中常见的需求。这样的封装不仅提高了代码的可维护性&#xff0c;还使得在组件中使用网络请求更加简洁。本文将详细介绍UniApp Vue 3中的网络请求封装&#xff0c;并提供一个简单的用法示例。 创…...

策略模式结合模板方法模式

之前学习了策略模式加模板方法模式 策略模式单独详解 模板方法模式单独详解 这里回忆起完全可以进行策略和模板方法模式的组合。 import java.util.HashMap; import java.util.Map;// 上下文对象&#xff08;解决参数传递问题&#xff09; class OrderContext {private final…...

每日算法-250407

记录一下今天刷的三道 LeetCode 题目。 2389. 和有限的最长子序列 题目 思路 排序 前缀和 二分查找 解题过程 理解题意: 题目要求我们对于 queries 数组中的每个查询值 q&#xff0c;找出 nums 数组中元素和 小于等于 q 的 最长子序列 的长度。注意&#xff0c;是子序列&am…...

【Git “ls-tree“ 命令详解】

本章目录: 1. 命令简介2. 命令的基本语法和用法基本语法常见使用场景示例 1&#xff1a;查看当前提交的文件树示例 2&#xff1a;查看某个分支的文件树示例 3&#xff1a;查看特定路径下的文件树 3. 命令的常用选项及参数常用选项&#xff1a; 4. 命令的执行示例示例 1&#xf…...