mysql和redis的双写一致性问题
一,使用方案
在使用redis作为缓存的场景下,我们一般使用流程如下
二,更新数据场景
我们此时修改个某条数据,如何保证mysql数据库和redis缓存中的数据一致呢?
按照常规思路有四种办法,1.先更新mysql数据,再更新缓存数据 2.先更新缓存数据,再更新mysql数据
3.先删除缓存,再更新mysql数据 4.先更新mysql数据,再删除缓存 。
这四种方法各有各的弊端,并不能完全保证数据一致性,采用“先写 MySQL,再删除 Redis”的策略,这种情况虽然也会存在两者不一致,但是需要满足的条件有点苛刻,所以是满足实时性条件下,能尽量满足一致性的最优解。对于不是强一致性要求的业务,可以容忍。(什么情况下不能容忍呢,比如秒杀业务、库存服务等。)
为什么采用删除缓存而不是更新缓存,是因为高并发下产生脏数据的要求要比更新缓存的要求更多,也就是删除缓存产生脏数据的概率更小一些。
那么问题又来了,在高并发的情况下
采用先删除缓存,再更新数据库
- 请求A来了,删除缓存
- 请求A更新数据库,发生卡顿,同时来了请求B
- 请求B发现没有缓存,就从数据库查询了数据,并生成了缓存
- 此时请求A卡顿结束,更新了数据库
这个情况下,缓存中的就是脏数据。我们采用延时双删来解决
那么问题又来了,第二次删除缓存失败了怎么办?看下面 - 先更新数据库,再删除缓存
如果删除缓存失败,怎么保证数据一致性?
1.使用重试机制,可以直接在接口中重试,但是比较耗费性能
2.使用异步队列重试
3.使用rabbitmq消息中间件来处理
当用户操作写完数据库,但删除缓存失败了,产生一条mq消息,发送给mq服务器。
mq消费者读取mq消息,重试5次删除缓存。如果其中有任意一次成功了,则返回成功。如果重试了5次,还是失败,则写入死信队列中。
当然在该方案中,删除缓存可以完全走异步。即用户的写操作,在写完数据库之后,不用立刻删除一次缓存。而直接发送mq消息,到mq服务器,然后有mq消费者全权负责删除缓存的任务。
因为mq的实时性还是比较高的,因此改良后的方案也是一种不错的选择。
总结:以上方法只能保证最终一致性,不能保证强一致性
相关文章:
mysql和redis的双写一致性问题
一,使用方案 在使用redis作为缓存的场景下,我们一般使用流程如下 二,更新数据场景 我们此时修改个某条数据,如何保证mysql数据库和redis缓存中的数据一致呢? 按照常规思路有四种办法,1.先更新mysql数据&a…...
Qwen2——阿里巴巴最新的多语言模型挑战 Llama 3 等 SOTA
引言 经过几个月的期待, 阿里巴巴 Qwen 团队终于发布了 Qwen2 – 他们强大的语言模型系列的下一代发展。 Qwen2 代表了一次重大飞跃,拥有尖端的进步,有可能将其定位为 Meta 著名的最佳替代品 骆驼3 模型。在本次技术深入探讨中,我…...
等级考试3-2021年3月题
作业: #include <iostream> using namespace std; int chonghe(int,int,int,int); int main(){int a[1000],b[1000];int n,ma0;cin>>n;for(int i0;i<n;i){cin>>a[i]>>b[i];}for(int i0;i<n;i){for(int ji1;j<n;j){mamax(ma,chongh…...
Web前端开发PPT:深入探索与实战应用
Web前端开发PPT:深入探索与实战应用 在数字化时代,Web前端开发已成为构建丰富、交互性强的网页应用的关键环节。本次分享旨在通过PPT的形式,带领大家深入探索Web前端开发的精髓,并分享一些实战应用的经验。接下来,我们…...
liunx常见指令
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 二、安装环境 1.租借服务器 2.下载安装 XShell 3.使用xshll登录服务器 三、Linux基础命令 一、文件和命令 编辑1、cd 命令 2、pwd 命令 3、ls 命令 4、cp 命令 …...
vscode设置成中文界面
在Visual Studio Code(VSCode)中设置中文界面,你可以采用以下几种方法,以下是详细步骤: 方法一:通过设置菜单设置中文 打开VSCode:首先,确保你已经打开了VSCode软件。进入设置&…...
python命名空间详解
Python中的命名空间是编程语言设计的一个核心概念,它负责存储变量名与其对应的值之间的映射关系,确保了程序中变量的唯一性和可访问性。命名空间不仅关乎变量的生命周期和作用范围,也是Python中实现封装、避免命名冲突的重要机制。 1. 命名空…...
【日常记录】【vue】vite-plugin-inspect 插件的使用
文章目录 1、vite-plugin-inspect2、安装3、使用4、链接 1、vite-plugin-inspect vite-plugin-inspect 可以让开发者在浏览器端就可以看到vue文件编译后的代码、vue文件的相互依赖关系 2、安装 npm i -D vite-plugin-inspect// vite.config.ts import Inspect from vite-plugi…...
mini web框架示例
web框架: 使用web框架专门负责处理用户的动态资源请求,这个web框架其实就是一个为web服务器提供服务的应用程序 什么是路由? 路由就是请求的url到处理函数的映射,也就是说提前把请求的URL和处理函数关联好 管理路由可以使用一个…...
基于C#开发web网页管理系统模板流程-主界面统计功能完善
点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善_c#web程序设计-CSDN博客 统计功能是管理系统很常见的功能,例如仓库管理系统要统计某时间段的出入库以…...
chromedriver114以后版本下载地址汇总chromedriver所有版本下载地址汇总国内源下载
谷歌浏览器版本经常会升级,chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ 但是自从115版本及其以后网站就找不到了,因此整理了截止2024年6月16日前所有在windows x6…...
x86计算机的启动初期流程 Linux 启动流程
x86计算机的启动初期流程 CPU: step1,加点开机,cpu自己初始化 step2,cpu 从物理地址 0xFFFFFFF0h 取指令执行;此处存放BIOS代码,这些代码可以是由主板自动从 EEPROM中拷贝至此内存地址处;即下…...
P450Rdb: CYP450数据库--地表最强系列--文献精读24
P450Rdb: A manually curated database of reactions catalyzed by cytochrome P450 enzymes P450Rdb: 一个人工整理的细胞色素P450酶催化反应数据库 http://www.cellknowledge.com.cn/p450rdb/ 还有一篇类似CYP450综述-20年-地表最强系列-文献精读-4 要点: P450…...
ubuntu 22.04下载和安装
ubuntu镜像: https://www.releases.ubuntu.com/22.04/ 然后下载vmwareworkstation16 密钥 ZF3R0-FHED2-M80TY-8QYGC-NPKYF...
Fegin如何传参form-data文件
Form-data传输file参数,这个大家都比较清楚,那么针对于Fegin参数file参数该如何操作呢!下面截图来找到对应的参数关系。 一、之前我们在postMan中是这种传参的,那么如果使用Feigin来传输文件File 二、在Fegin中传form-data参数&a…...
解决 Visual C++ 17.5 __cplusplus 始终为 199711L 的问题
目录 软件环境问题描述查阅资料解决问题参考文献 软件环境 Visual Studio 2022, Visual C, Version 17.5.4 问题描述 在应用 https://github.com/ToniLipponen/cpp-sqlite 的过程中,发现源代码文件 sqlite.hpp 中,有一处宏,和本项目的 C L…...
Mac M3 Pro安装Hadoop-3.3.6
1、下载Hadoop安装包 可以到官方网站下载,也可以使用网盘下载 官网下载地址:Hadoop官网下载地址 网盘地址:https://pan.baidu.com/s/1p4BXq2mvby2B76lmpiEjnA?pwdr62r提取码: r62r 2、解压并添加环境变量 # 将安装包移动到指定目录 mv …...
mac下Xcode在iphone真机上测试运行iOS软件
最近一个需求需要在iPhone真机上测试一个视频直播的项目。 需要解决如何将项目 app 安装到真机上 在进行真机调试。 安装Xcode 直接在App Store上搜索Xcode安装即可。 关键是要安装Simulator。项目需要安装iOS17.5但是由于安装包太大,并且网络不稳定的原因。在Xco…...
Mysql(一):深入理解Mysql索引底层数据结构与算法
众所众知,MySql的查询效率以及查询方式,基本上和索引息息相关,所以,我们一定要对MySql的索引有一个具体到数据底层上的认知。 这一次也是借着整理的机会,和大家一起重新复习一下MySql的索引底层。 本节也主要有一下的…...
WebMvcConfigurer配置不当导致鉴权失败
最近同事说他们有个新需求,需要对接口进行加解密,所以他给项目配置了一个拦截器,但这个拦截器直接导致了所有接口鉴权失败,每次调用接口都是提示没有session信息。 公司内的所有java项目是公用同一套基础依赖,所以我也…...
微信小程序毕业设计-实验室管理系统项目开发实战(附源码+论文)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...
C#:lock锁与订单号(或交易号)的生成
在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。 static void Main(string[] args){for(int i0; i<100; i){//GetRandomTime(…...
计算机图形学入门11:图形管线与着色器
1.什么是图形管线 把场景中的物体经过一系列的处理,最后一张图像的形式在屏幕上显示出来,这一系列过程就是图形管线(Graphics Pipeline),也叫实时渲染管线(Real-time Rendering Pipeline)。如下图所示,为整个渲染管线的过程。 渲染…...
正解 x86 Linux 内存管理
1,机器解析的思路 发现网络上大量的教程,多是以讹传讹地讲解 Linux 内存管理; 都是在讲: 逻辑地址 -> 线性地址 -> 物理地址 这个转换关系是怎么发生的。 上面这个过程确实是程序运行时地址的翻译顺序; …...
springboot读取配置时,读取到了系统环境变量
在Spring Boot应用中,读取配置通常通过application.properties或application.yml文件进行。不过,Spring Boot也支持从系统环境变量读取配置,这使得应用可以在不同的环境中灵活配置。下面详细介绍如何在Spring Boot中读取系统环境变量。 1. 配…...
平均召回(Average Recall,AR)概述
平均召回(Average Recall,AR)概述 在深度学习中,平均召回(Average Recall, AR)是一个衡量模型在不同阈值下的召回率的综合指标,特别常用于目标检测任务。召回率(Recall)…...
WWDC 2024 回顾:Apple Intelligence 的发布与解析
一年一度的苹果全球开发者大会(WWDC)如期而至,2024 年的 WWDC 再次成为科技界的焦点。本次发布会中,苹果正式推出了他们在 AI 领域的全新战略——Apple Intelligence。这一全新概念旨在为用户打造“强大、易用、全面、个性化、注重…...
[Cloud Networking] SPDY 协议
文章目录 1. 背景2. SPDY 之前3. SPDY 项目目标4. SPDY 功能特点4.1 SPDY基本功能4.2 SPDY高级功能 1. 背景 TCP是通用的、可靠的传输协议,提供保证交付、重复抑制、按顺序交付、流量控制、拥塞避免和其他传输特性。 HTTP是提供基本请求/响应语义的应用层协议。 不…...
Linux-笔记 samba实现映射网络驱动器到Win 10
前言 之前通过网上的方法成功映射后,现如今在自己电脑想实现映射服务器共享文件夹到Win 10端发现对之前的方法没有总结导致细节出问题,特此写下笔记。 场景 在服务器编译好代码生成镜像后,在Win10端采用软件烧写镜像,但是镜像在服…...
【技巧】Leetcode 67. 二进制求和【简单】
二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a “11”, b “1” 输出:“100” 示例 2: 输入:a “1010”, b “1011” 输出:“10101” 解题思路 …...
怎么做网站dreamwave/杭州网站建设 seo
复制文件夹中所有内容到指定位置 /*** 复制文件夹下的所有文件到指定目录* param oldPath* param newPath*/public static void copyFolder(String oldPath, String newPath) {try {// 如果文件夹不存在,则建立新文件夹(new File(newPath)).mkdirs();//读取整个文件…...
全国最大的源码平台/seo博客教程
Express 框架入门(二)Cookie、session、应用程序生成器一、Cookie 简介二、Cookie 特点三、Cookie 的使用四、加密Cookie五、cookie 综合案例六、Session 简单介绍七、Session 的工作流程八、express-session 的使用九、 express-session 的常用参数十、…...
网站开发公司 网站空间/业务推广方式有哪些
python统计字符的个数代码实例 python统计不同字符的个数 首先使用input获取输入数据,并存入到str参数里 然后使用for循环str的每一个字符,循环内使用str.count()获取字符出现的字数,并存入一个字典中 最后输出字典即可。 代码如下࿱…...
营销网站/东莞网络推广
新添加一个收藏,把网页地址改为以下js脚本: 1 javascript:navigator.__defineGetter__(platform,function(){return}) 当下载文件时,先点击一次书签栏(收藏栏)的绕过代码书签,再次点击“下载”就可以实现跳…...
短视频seo软件/新站优化案例
一、功能不同 margin-top:功能为设置元素的上外边距。top:规定元素的顶部边缘。 二、特点不同 margin-top:允许使用负值。定义固定的上外边距。默认值是 0。top:定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。…...
视频网站如何做盗链/威海网站制作
文章目录1 报错2 解决办法1 报错 尝试在linux上通过Pycharm IDE使用matplotlib包。当我运行此代码时: from matplotlib import pyplot结果报错: ImportError: No module named tkinter2 解决办法 ubuntu的系统: sudo apt-get install py…...