为什么延迟删除可以保证MYSQL 与redis的一致性?

看过很多保持MYSQL 与redis保持一致性的文章都提到了延迟删除,其实脱离任何业务场景的设计都是不切实际的,所以我会本着一个通用的读写场景去分析为什么延迟删除大概率可以保证MYSQL与redis的最终一致。

通常的读写场景

通常在使用redis作为读写缓存时,我们采用的是cache aside pattern 的形式,这种形式的读写一般是这样,

1,读请求: 从缓存中获取不到数据时,从db中读取数据,然后再set到缓存里。

2,写请求: 修改db中的数据,然后删掉缓存。

这样的模式大概率是不会有问题的,但是会有极小的概率出现读请求中,可能会很长时间存在旧数据,来看一下这个例子, 下面的数字标明了每个步骤执行的顺序。

可以看到在并发环境下,如果读请求先从db中读取了旧数据,然后写请求再去执行修改db,删除缓存的操作,此时读请求再把读取出来的旧db数据 set到缓存中,那么后续的读请求便会会一直读取到旧数据的缓存,除非缓存过期。

image.png

延迟删除是如何解决db与缓存数据不一致的

其实无论是上述缓存模型,还是其他的读写缓存方式,在并发环境下,其实都有可能出现缓存旧数据的问题,其本质原因是,修改缓存的地方不是单协程进行的,多协程修改必然存在并发先后的问题

解决上述不一致的方式是可以延迟写请求中,删除缓存的时间。先来看下读写请求的并发场景,

1,如果读请求发生在写请求前,那么写请求后续删除缓存,是不存在不一致问题的。

2,如果读请求发生在写请求后,那么后续读请求读取出来的数据就是新数据,也不会有问题。

3,如果读写同时发生,但是缓存还未过期,此时也不会有一致性问题。

4,如果读写同时发生,但是缓存过期,这个时候才有可能出现上面缓存中长时间存在旧数据的问题。

基于此,我们可以延迟写请求中删除缓存的时间,因为一般我们数据有段比较长的缓存时间,在最开始读请求更新缓存后,后续的读请求会比较长时间读取缓存中数据,我们让写请求等待(可以同步,也可以异步)最开始更新缓存的读请求结束,然后再去删除缓存,就避开了读写请求并发更新缓存的场景,这样,下次读请求就不会读取到旧db数据缓存,而是重新从db中获取新数据。

具体等待多长时间才进行缓存删除,需要根据业务读请求接口的处理时长自己决定。

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

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

相关文章

Oracle SEQUENCE实现自增流水号,并设置定时任务每日清零

--创建增长序列 create sequence IMES.TEST_SEQ_PALLET minvalue 1 maxvalue 1336335 start with 1 increment by 1 nocache cycle order; --测试 select IMES.TEST_SEQ_PALLET.nextval from dual; --创建存储过程重置自增序列从1开始 IMES.TEST_SEQ_RESET_NEXT create or r…

无人机/飞控--ArduPilot、PX4学习记录(2)

这是一篇碎碎念,零零碎碎的记录了环境配置过程,仅供本人记录学习历程和参考。(记录的挺乱的,但是文章链接里的博客写的是真好) 本章主要完成的目标: 安装PX4 并 成功运行出3D无人机界面。 参考文章: 搭建PX4环境&…

虹科干货 | 网络取证分析和入侵分析培训重磅来袭,先来认真预习!什么是IOC?应该如何识别和响应?

文章速览: 网络安全中的IOC是什么?IOC和IOA有什么区别?IOC有哪些类型?IOC的常见实例有哪些?IOC解决方案和工具 近期,Wireshark 大学和 虹科Allegro Packets联合举办了网络取证和入侵分析线上培训课程&…

cv::Mat::depth() 获取图像的深度时返回值为0?

在OpenCV中,当使用函数比如 cv::Mat::depth() 获取图像的深度时,返回的整数值是代表数据类型的枚举值,而不是直接的比特数。这些枚举值定义在cv::Mat的数据类型中,用于描述像素值的数据类型及其位深度。如果cv::Mat::depth() 返回…

不同的Git仓库单独设置用户名和邮件地址

最近使用公司电脑将自己的一个私人项目推送到远程仓库,仓库显示的公司邮箱地址。因为设置了全局的username和usermail,这样就比较尴尬了。但是又不能频繁来回改用户信息,那么请看下面如何单独设置仓库的用户信息,让不同的仓库展示…

走上管理岗才发现:所谓工作能力强,就一点

走上管理岗才发现:所谓工作能力强,就一点 建立SOP‼️ - 我二本工科,电力专业,从现场工程师到新能源公司核心部门经理,入职公司三个月直接升职加薪。 - 我刚从工程师升至经理带团队的时候,经常靠加班续命&a…

zookeeper底层细节

zk 临时节点和watch机制实现注册中心自动注册和发现,数据都在内存,nio 多线程模型; cp注重一致性,数据不一致时集群不可用 事务请求处理方式 1.all事务由唯一服务器处理 2.将客户端事务请求转成proposal分发follower 3.等待半…

部署单节点k8s并允许master节点调度pod

安装k8s 需要注意的是k8s1.24 已经弃用dockershim,现在使用docker需要cri-docker插件作为垫片,对接k8s的CRI。 硬件环境: 2c2g 主机环境: CentOS Linux release 7.9.2009 (Core) IP地址: 192.168.44.161 一、 主机配…

【spring】@ConditionalOnResource注解学习

ConditionalOnResource 介绍 ConditionalOnResource 是Spring框架中的一个条件化注解,它允许你根据类路径中是否存在指定的资源来决定是否加载特定的Bean定义或配置类。这个注解可以用于类级别或方法级别。 具体Conditional使用请看这篇文章【spring】Conditional…

停车管理系统asp.net+sqlserver

停车管理系统asp.netsqlserver 说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net架构和sql server数据库, 功能模块: 停车管理系统asp.net sqlserver 用户功能有菜单列表 我的停车记录 专…

vue3<setup>中判断当前视口距离顶部的距离

在 Vue 3 的 <script setup> 语法中&#xff0c;你可以使用 Composition API 来跟踪视口距离顶部的距离。你可以创建一个响应式的 ref 来存储这个距离&#xff0c;并在 onMounted 生命周期钩子中设置一个滚动事件监听器来更新这个值。下面是一个示例&#xff1a; <te…

VMWare虚拟机使用openmediavault搭建NAS服务器完整步聚

下载: gopenmediavault - The open network attached storage solution 下载好openmediavault的ISO镜像后,打开虚拟机并安装 系统类型选择Debian 启动虚拟机并安装openmediavault 选择中文 地区选中国 键盘配置选汉语 开始安装 配置网络信息 配置root密码 确认密码 系统安装中…

贪心算法概念

前言 一种在问题求解过程中总是做出当前看来最优选择的策略。这个"最优选择"是在某个特定意义上的局部最优解&#xff0c;而不是全局最优解。 贪心算法并非对所有问题都能得到整体最优解&#xff0c;其关键在于贪心策略的选择。所选取的贪心策略必须具备无后效性&…

零基础机器学习(3)之机器学习的一般过程

文章目录 一、机器学习一般过程1.数据获取2.特征提取3.数据预处理①去除唯一属性②缺失值处理A. 均值插补法B. 同类均值插补法 ③重复值处理④异常值⑤数据定量化 4.数据标准化①min-max标准化&#xff08;归一化&#xff09;②z-score标准化&#xff08;规范化&#xff09; 5.…

构造算法详解

构造题是比赛和解决问题的过程中比较常见的题型。他们通常要求解题者通过观察问题的结构和规律&#xff0c;找到一种通用过的方法或模式&#xff0c;使得在问题规模增大时&#xff0c;依然能够高效地得到答案 观察问题规模的增长&#xff1a;了解问题随规模的增大&#xff0c;…

应用改进SA算法实现MATLAB-HFSS交互仿真与天线优化

应用改进SA算法实现MATLAB-HFSS交互仿真与天线优化 第一章SA算法及其简单应用1.1 SA算法简介1.2 SA算法原理1.2.1 SA算法原理 1.3 Metropolis准则及退火过程中的参数控制1.3.1 Metropolis准则1.3.2退火过程中的参数控制 1.4 SA算法简单应用 第二章 改进SA算法2.1 改进方向2.2 改…

Android Preference简单介绍

Android Preference简单介绍 文章目录 Android Preference简单介绍一、前言二、Preference 简单介绍二、PreferenceScreen和SwitchPreference 简单示例2、相关demo代码示例&#xff08;1&#xff09;SettingsActivity.Java&#xff08;2&#xff09;layout\settings_activity.x…

Qt学习笔记(一)——Qt初识

本文仅是 学习时记录的笔记&#xff0c;供自己复习时使用。 1.创建好文件(QWidget窗口) main.cpp中&#xff1a; 注&#xff1a;Widget类继承父类QWidget. widget.h中&#xff1a; Widget.cpp中&#xff1a; 打开Forms文件夹中的widget.ui文件&#xff1a; 打开左边编辑&am…

【吊打面试官系列】Redis篇 - 为什么 redis 需要把所有数据放到内存中?

大家好&#xff0c;我是锋哥。今天分享关于 为什么 redis 需要把所有数据放到内存中 面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 为了达到最快的读写速度将数据都读到内存中&#xff0c;并通过异步的方式将数 据写入磁盘。所以 redis 具有快速和数据持久化的特征。…

飞腾+FPGA+AI电力行业智能数据采集与分析网闸解决方案

行业痛点: 安全物联网闸在监控平台中的具体作用&#xff1a;35KV变电站是煤矿的动力核心&#xff0c;采矿人员上下井、煤炭提升输送、矿井通风等核心设备均依靠变电站提供电源。监控中心及时掌握变电站的运行状态对煤矿的安全生产非常重要。如若外部通过监控网络来控制变电站会…