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

在这里插入图片描述

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

在这里插入图片描述

所谓的双写一致指的是,在同时使用缓存(如Redis)和数据库(如MySQL)的场景下,确保数据在缓存和数据库中的更新操作保持一致。当对数据进行修改的时候,无论是先修改缓存还是先修改数据库,最终都要保证两者的数据状态一致。
保持一致的方案一般有四种:
1.先修改数据库,再修改缓存
2.先修改缓存,再修改数据库
3.先修改数据库,再删除缓存
4.先删除缓存,再修改数据库

前三种解决方案,有一个问题,也就是当第一次操作执行完成之后,第二步未执行的情况下,就会导致数据库和缓存不一致的问题,比如第一步执行完了,然后系统掉电了,那么一致性问题就会显现出来了。
然而,第四种解决方案,在第一步执行完了,如果掉电了,最起码数据库和缓存都没执行成功呢,数据都不是最新的呢,从数据一致性的层面来讲,确实一致了,但是第四种还有如下问题:
1.业务完整性:第一步完成了,但是掉电或者死机了,第二步没执行。
2.并发保存后缓存旧值问题:比如以下情况
在这里插入图片描述
所以最好的解决办法就是:
先删除缓存,再修改数据库,并且组合上消息队列(针对问题1)和延迟双删(针对问题2)

为啥使用消息队列呢?
消息确认机制允许接收消息的程序(消费者)在完成消息处理之后明确地告知消息队列系统:“我已经处理了这条消息。”这个确认过程是至关重要的,因为它让消息队列系统知道该消息是否已被成功消费。如果消费者在处理消息过程中发生故障(如掉电或重启),消息队列会根据消费者是否已确认消息来决定下一步的行动:
如果消息未被确认,消息队列系统将认为该消息尚未被完全处理,因此在消费者恢复后会再次传送该消息进行处理。
如果消息已被确认,消息队列系统则会从队列中移除该消息,因为它的任务已经完成。
这种机制确保了业务流程的完整性,即使在发生故障的情况下,业务流程也能在系统恢复后继续执行未完成的部分。这就是为什么消息队列广泛用于分布式系统中保证数据处理的可靠性和一致性,特别是在需要保障数据不丢失的情况下

为啥使用延迟双删呢?
延迟双删指的就是删除两次缓存,流程如下
1.删除缓存:此步骤为了避免获取到旧缓存中的旧数据
2.更新数据库:删除之后就先更新数据库
PS:前两步就是上面的逻辑(先删除缓存,再修改数据库)
3.延迟一会再删除缓存:此步骤是为了避免上面因为并发问题导致保存旧值的情况发生,所以会延迟一段时间之后再进行删除操作。这样即使有并发问题,也能最大限度的解决保存旧值的情况,因为是延迟之后删除的,所以即使是因为并发问题保存了旧值,但是延迟一段时间之后,旧值就会被删除,那么这样就自然而然的保证了数据库和缓存的最终一致性。
4.更新缓存(可选):在某些情况下,第二次删除之后,你可能会选择立即更新缓存。这通常是为了确保缓存中的数据尽可能的保持最新。但这不是必须的,因为缓存可以在下次有需要时通过正常的缓存加载策略被再次填充。
PS:如果这时候你更新缓存了,那么如果再有多线程并发的情况,这时候数据库已经是新值了,所以就不会再有缓存旧值的情况了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

transformer注意力权重系数绘图

参考绘制tsne图,首先将模型中的注意力权重导出,因为我的模型中L2,所以导出两层 # plot_weight weight_model_layer0 Model(inputsmodel.inputs, outputsmodel.get_layer(transformer_0).output) weight_output_layer0 weight_model_layer0…

C语言内存函数详解

文章目录 前言一、memcpy函数(内存拷贝函数)二、memmove重叠拷贝函数三.memset内存设置函数四.memcmp内存比较函数总结 前言 我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数,接下来我们就学习一下关于内存相关的一些函数。…

第十四届蓝桥杯 三国游戏

一开始的思路就是想着暴力,但是呢,如果真的用暴力一个一个列的话,连30%的数据都搞定不了,所以这里需要考虑别的办法。 这道题的思路就是贪心。 我们这样想:既然要满足至少一个国X>YZ,那么我们何不变成…

超实用绿色办公软件介绍

自制的绿色软件办公秘书软件,集成了自动任务、文件工具、PDF工具、OCR图文识别、文字处理、电子表格六大类30多项实用功能, 开发目的是解决常见办公痛点,把机械的操作还给机器,实现轻松、高效办公。 功能介绍如下: 一…

EndeavourOs(arch系)安装sunpinyin输入法(ibus) + 迅雷(xunlei-bin)

输入法 yay -S ibus yay -S ibus-libpinyin yay -S ibus-sunpinyin yay -Q ibus ibus-libpinyin ibus-sunpinyin #验证 # 注销然后打开ibus config... # 在Input Method 添加Chinese->SunPinYin # 使用Ctrl Space, 默认Super Space, 请自行修改 # 再次注销,开…

Linux环境下Minio的安装部署与启动教程(完整版)

1、概述 MinIO是一个开源、分布式的对象存储系统,专为云原生环境设计。它提供了一个基于标准的Amazon S3兼容接口,使得开发者可以使用熟悉的API在私有云或边缘环境中部署和管理大规模非结构化数据,如图片、视频、日志文件等。 MinIO的核心特…

安卓UI面试题 41-45

41. View.inflate和LayoutInflater.inflate的区别? 实际上没有区别,View.inflate实际上是对LayoutInflater.inflate做了一层包装, 在功能上,LayoutInflate功能更加强大。View.inflate实际上最终调用的还是LayoutInflater.inflate (@LayoutRes int resource, @nullable Vie…

ChatGLM:基于ChatGLM-6B使用ptuning进行微调,实现类instruction的效果

由于业务需要,调研下怎么训练一个虚拟角色出来,所以找了一些文档参考,其中有一个基于ChatGLM-6B使用ptuning进行微调,实现类instruction的效果的现成的项目,给大家分享下。 一、介绍 由于ChatGLM-6B 不支持instructio…

2、计划任务不显示UI的问题

计划任务不显示UI的问题 1、原因: 在windows7以上系统,使用system权限启动的进程默认是没有ui界面,这是windows系统出于安全考虑的限制。防止用户在高权限下误删重要的文件。 2、解决方案: 1、降权 解决的办法:降…

Linux内核--基本概念/基本结构和组件

提示:本系列文章重点学习Linux内核 Linux内核--基本概念/基本结构和组件 简介一、基础概念1.六项工作内容2.根文件系统(Root File System):3.交叉编译(Cross-Compilation):4.设备树(…

【矩阵】240. 搜索二维矩阵 II【中等】

搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22…

居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)

居民健康监测小程序目录 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

超越 GPT4,科大讯飞,再出王炸!

哈喽,大家好! 去年,科大讯飞星火大模型上线,给大家推荐了一波,演示了其强大的功能,不少小伙伴都立马申请体验了一把,也有私信说非常强大,工作效率提高不少,支持国产大模…

c语言:操作符详解(上)

目录 一、操作符的分类二、二进制和进制转换1.2进制转10进制2.10进制转2进制3.2进制转8进制4.2进制转16进制 三、原码、反码、补码四、算术操作符、-、*、/、%1.**和-**2.*3./4.% 五、移位操作符1.左移操作符2.右移操作符 六、位操作符:&、|、^、~七、赋值操作符…

27.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据推测功能的实现

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于: 易道云信息技术研究院VIP课 上一个内容:26.实现生成日志…

Java手写简易数据库--持续更新中

MYDB 0. 项目结构0.1 引用计数缓存框架为什么不使用LRU引用计数缓存缓存框架实现 0.2 共享内存数组 1. 事务管理器--TM1.1 XID 文件XID 规则XID 文件结构读取方式事务状态 1.2 代码实现 2. 数据管理器--DM2.1 页面缓存页面结构页面缓存数据页管理第一页普通页 2.2 日志文件 3. …

MQ 延迟队列

MQ 延迟队列 1. 前言 延迟队列是我们日常开发过程中,经常接触并需要使用到的一种技术方案。前些时间在开发业务需求时,我也遇到了一个需要使用到延迟消息队列的需求场景,因此我也在网上调研了一系列不同的延迟队列的实现方案,在…

【Linux】信号量和线程池

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:题目解析 🌎推荐文章:【Linux】进程通信——共享内存消息队列信号量 目录 👉🏻信号量👉&#x1f…

Mybatis-plus神技:公共字段填充

背景 在日常开发中,我们经常需要处理一些公共字段的自动填充,例如在每次插入或更新数据时自动设置创建时间和更新时间。这些重复性的工作可以通过 MyBatis-Plus 提供的 MetaObjectHandler 接口来简化,实现公共字段的自动填充,提高…

微信小程序原生<map>地图实现标记多个位置以及map 组件 callout 自定义气泡

老规矩先上效果图: 1 、在pages文件夹下新建image文件夹用来存放标记的图片。 2、代码片段 也可以参考小程序文档:https://developers.weixin.qq.com/miniprogram/dev/component/map.html index.wxml代码 <mapid="map"style="width: 100%; height:100%;&…