如何保存缓存和MySQL的双写一致呢?

如何保存缓存和MySQL的双写一致呢?

所谓的双写一致指的是,在同时使用缓存(如Redis)和数据库(如MySQL)的场景下,确保数据在缓存和数据库中的更新操作保持一致。当对数据进行修改的时候,无论是先修改缓存还是先修改数据库,最终都要保证两者的数据状态一致。
保持一致的方案一般有四种:
1.先修改数据库,再修改缓存
2.先修改缓存,再修改数据库
3.先修改数据库,再删除缓存
4.先删除缓存,再修改数据库
前三种解决方案,有一个问题,也就是当第一次操作执行完成之后,第二步未执行的情况下,就会导致数据库和缓存不一致的问题,比如第一步执行完了,然后系统掉电了,那么一致性问题就会显现出来了。
然而,第四种解决方案,在第一步执行完了,如果掉电了,最起码数据库和缓存都没执行成功呢,数据都不是最新的呢,从数据一致性的层面来讲,确实一致了,但是第四种还有如下问题:
1.业务完整性:第一步完成了,但是掉电或者死机了,第二步没执行。
2.并发保存后缓存旧值问题:比如以下情况

所以最好的解决办法就是:
先删除缓存,再修改数据库,并且组合上消息队列(针对问题1)和延迟双删(针对问题2)
为啥使用消息队列呢?
消息确认机制允许接收消息的程序(消费者)在完成消息处理之后明确地告知消息队列系统:“我已经处理了这条消息。”这个确认过程是至关重要的,因为它让消息队列系统知道该消息是否已被成功消费。如果消费者在处理消息过程中发生故障(如掉电或重启),消息队列会根据消费者是否已确认消息来决定下一步的行动:
如果消息未被确认,消息队列系统将认为该消息尚未被完全处理,因此在消费者恢复后会再次传送该消息进行处理。
如果消息已被确认,消息队列系统则会从队列中移除该消息,因为它的任务已经完成。
这种机制确保了业务流程的完整性,即使在发生故障的情况下,业务流程也能在系统恢复后继续执行未完成的部分。这就是为什么消息队列广泛用于分布式系统中保证数据处理的可靠性和一致性,特别是在需要保障数据不丢失的情况下
为啥使用延迟双删呢?
延迟双删指的就是删除两次缓存,流程如下
1.删除缓存:此步骤为了避免获取到旧缓存中的旧数据
2.更新数据库:删除之后就先更新数据库
PS:前两步就是上面的逻辑(先删除缓存,再修改数据库)
3.延迟一会再删除缓存:此步骤是为了避免上面因为并发问题导致保存旧值的情况发生,所以会延迟一段时间之后再进行删除操作。这样即使有并发问题,也能最大限度的解决保存旧值的情况,因为是延迟之后删除的,所以即使是因为并发问题保存了旧值,但是延迟一段时间之后,旧值就会被删除,那么这样就自然而然的保证了数据库和缓存的最终一致性。
4.更新缓存(可选):在某些情况下,第二次删除之后,你可能会选择立即更新缓存。这通常是为了确保缓存中的数据尽可能的保持最新。但这不是必须的,因为缓存可以在下次有需要时通过正常的缓存加载策略被再次填充。
PS:如果这时候你更新缓存了,那么如果再有多线程并发的情况,这时候数据库已经是新值了,所以就不会再有缓存旧值的情况了。
相关文章:
如何保存缓存和MySQL的双写一致呢?
如何保存缓存和MySQL的双写一致呢? 所谓的双写一致指的是,在同时使用缓存(如Redis)和数据库(如MySQL)的场景下,确保数据在缓存和数据库中的更新操作保持一致。当对数据进行修改的时候,无论是先修改缓存还是先修改数据库,最终都要保…...
第十三篇:复习Java面向对象
文章目录 一、面向对象的概念二、类和对象1. 如何定义/使用类2. 定义类的补充注意事项 三、面向对象三大特征1. 封装2. 继承2.1 例子2.2 继承类型2.3 继承的特性2.4 继承中的关键字2.4.1 extend2.4.2 implements2.4.3 super/this2.4.4 final 3. 多态4. 抽象类4.1 抽象类4.2 抽象…...
PyTorch学习笔记之基础函数篇(四)
文章目录 2.8 torch.logspace函数讲解2.9 torch.ones函数2.10 torch.rand函数2.11 torch.randn函数2.12 torch.zeros函数 2.8 torch.logspace函数讲解 torch.logspace 函数在 PyTorch 中用于生成一个在对数尺度上均匀分布的张量(tensor)。这意味着张量中…...
C++/CLI学习笔记3(快速打通c++与c#相互调用的桥梁)
c/cli变量和操作符 3.1:什么是变里 变量是存储数据以便应用程序临时使用的内存位置,具有名称、类型和值。变量值在应用程序执行期间可能改变,变量名也是。变量使用前必须声明,即指定类型和提供名称。变量的类型决定了值的范围以及能执行的操…...
unity
Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 Unity Remote - Unity 手册 登陆账号,找到一个3d 免费资源 3D Animations & Models | Unity Asset Store unity 里面window->package Manager 里面可以看到自己的asset ,下载后…...
考研复习C语言初阶(3)
目录 一.函数是什么? 二.C语言中函数的分类 2.1库函数 2.2自定义函数 三.函数的参数 3.1实际参数(实参) 3.2 形式参数(形参) 四.函数的调用 4.1 传值调用 4.2 传址调用 五. 函数的嵌套调用和链式访问 5.1 嵌套调用 5…...
CCF 202009-3 点亮数字人生(拓扑排序)
题目背景 土豪大学的计算机系开了一门数字逻辑电路课,第一个实验叫做“点亮数字人生”,要用最基础的逻辑元件组装出实际可用的电路。时间已经是深夜了,尽管实验箱上密密麻麻的连线已经拆装了好几遍,小君同学却依旧没能让她的电路正…...
Docker笔记-进入运行中的镜像,查看日志等操作
docker搭建好后,查看运行的docker镜像: docker ps -a 进入运行的容器,命令如下: docker exec -it <容器ID> /bin/bash # 或者,直接用容器里面的命令,比如mysql镜像 docker exec -it <容器ID>…...
大语言模型(LLM) RAG概念
RAG(Retrieval-Augmented Generation)是一种用于自然语言处理的模型架构,特别是针对生成式任务。RAG模型结合了检索和生成两种方法,以提高生成式任务的性能。它将信息检索(Retrieval)和文本生成(…...
PHP使用AES进行加解密
前言 对接一个第三方平台,其使用AES对称加密 代码 //方式1 //加密 function enAES($originTxt, $keyQ6Mr6rDpn12iZb){return base64_encode(openssl_encrypt($originTxt, AES-128-ECB,$key, OPENSSL_RAW_DATA)); }//解密 function deAES($originTxt, $keyQ6Mr6rD…...
20240313寻找集成联调交付的具体方式
集成联调交付(Integrated Joint Debugging and Delivery)是软件开发过程中的一个阶段,主要涉及将不同的软件模块或组件整合在一起,并进行联合调试和测试,以确保它们能够作为一个整体正常工作。这个过程通常发生在开发周…...
makefile 学习
patsubst 函数 原型$(patsubst 原模式, 目标模式, 文件列表) 如果文件列表中没有匹配的字符串,就会把整个文件列表的值赋值给变量 // 如果当前目录下有 main.cpp test.cpp SRC $(wildcard *.cpp *.c) # 在工作目录下寻找所有c cpp 文件 …...
释放人工智能的力量:GPU服务器托管和高电机柜托管的关键作用
随着人工智能技术的不断发展,GPU服务器托管和高电机柜托管也变得愈发重要。这些技术在人工智能领域发挥着关键作用,为AI算法的训练和推理提供了强大的计算支持。 GPU服务器托管是指将GPU服务器放置在专门的数据中心中,通过云服务提供商提供的…...
70后姐妹上海创业,要IPO了
一种能与消费者高效互动的自动贩卖机,不仅于近日将一家上海公司送到港交所的门前,还让一对70后姐妹的身价超过13亿元。 在殷珏辉和妹妹殷珏莲的带领下,中国营销服务提供商趣致集团坐拥7543台自动贩卖机和超过5000万注册用户。通过为品牌方提…...
React Hooks、useState、useEffect 、react函数状态
Hooks Hooks 概念理解 学习目标: 理解 Hooks 的概念及解决的问题 什么是 hooks hooks 的本质: 一套能够使函数组件更强大、更灵活的(钩子) React 体系里组件分为类组件和函数组件 多年使用发现,函数组件是一个更加匹…...
wsl-oraclelinux 固定ip
wsl-oraclelinux 固定ip 0. 引言1. Windows 创建启动脚本2. 配置 wsl Oracle Linux 0. 引言 工作需要,安装了一个 wsl Oracle Linux 8.9,也想给它一个固定的 ip。 1. Windows 创建启动脚本 删除 PSScheduledJob, notepad $PSHOME\powersh…...
性能测试工具——wrk的安装与使用
前言 想和大家来聊聊性能测试,聊到了性能测试必须要说的是性能测试中的工具,在这些工具中我今天主要给大家介绍wrk。 介绍 wrk是一款开源的性能测试工具 ,简单易用,没有Load Runner那么复杂,他和 apache benchmar…...
使用tui-image-editor 图片编辑 标注图片
需求背景: 鼠标悬浮在图片上 出现编辑按钮 点击编辑 对该图片进行编辑(输入文案、涂鸦、标记、裁剪等) 可以体验一下它线上编辑器 Image-editor | TOAST UI :: Make Your Web Delicious! 使用 首先在你的前端项目中安装: np…...
C++面试题和笔试题(五)
一、 #include <iostream> using namespace std; class Base { public: Base(int j) : i(j) {} virtual ~Base() {} void func1() { i * 10; func2(); } int getvalue() { return i; } protected: virtual void func2() { i; } protected: int i;…...
Mysql:行锁,间隙锁,next-key锁?
注:以下讨论基于InnoDB引擎。 文章目录 问题引入猜想1:只加了一行写锁,锁住要修改的这一行。语义问题数据一致性问题 猜想2:要修改的这一行加写锁,扫描过程中遇到其它行加读锁猜想3:要修改的这一行加写锁&…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
