Redis 入门及应用 ( 五 ) 双写一致性

news/2023/9/22 16:53:01

7.高级应用

7.1.数据库和缓存双写一致性

如果更新了数据库中的数据, 在缓存中的数据如何保持一致性?

4种方案 :

  1. 先写缓存, 再写数据库
  2. 先写数据库, 再写缓存
  3. 先删缓存, 再写数据库
  4. 先写数据库, 再删缓存

7.1.1.先写缓存, 再写数据库

先将更新的数据写入缓存, 再写入到数据

在这里插入图片描述

可能出现的异常 : 写入缓存成功 , 但写入数据库出现异常.

这种情况在缓存中出现"假数据",

**这种方法在实际工作中通常不用

7.1.2.先写数据库, 再写缓存

先写入数据库, 再写入缓存. 在低并发环境下或者数据不会引发太大的影响, 可以使用

7.1.2.1.异常情况一

在这里插入图片描述

请求a 写完数据库, 由于网络原因, 没有及时写入缓存

之后, 请求b 顺利完成写入数据库及缓存操作

此时缓存中存放的是新的数据

但请求a 在之后又完成了 ,写缓存的操作,

导致缓存中存放的是旧数据

7.1.2.2.写入缓存的操作比较复杂

如果存入缓存的数据得到比较复杂, 频繁的写入是比较消耗资源的

对于 写多 读少 的业务 就会很多问题

7.1.3.先删除缓存, 再写数据库

实现业务里, 可以不及时更新缓存, 而是等到查询里再去更新缓存

7.1.3.1.高并发下的问题

在这里插入图片描述

客户b 第7步写入的数据库里的旧数据, 没有包含客户a 新操作写入的新数据

7.1.3.2.缓存双删

在 上面的基础上 , 当 客户a 完成写入数据库一段时间后 , 再次将 缓存清空.

在这里插入图片描述

这里 一定要等一段时间, 因为太快, 可能出现 第9 步在 第7步之前执行 , 就失去意义了,

所以一定要等一段时间, 如: 500ms

一个新的问题, 如果 第9步 执行出错了怎么办?

7.1.4.先写数据库, 再删除缓存

有将数据写入到数据库后, 再删除缓存

但 如果有两个操作, 一个是写, 另一个是读, 情况如下

7.1.4.1.情况一 : 先写后读

先写, 后读, 但写入数据库后 , 再写入缓存时卡顿, 会导致读到旧数据

在这里插入图片描述

这个时候有问题, 但影响不是很大

7.1.4.2.情况二 : 先读后写

这种情况通常没有问题, 如果

在这里插入图片描述

缓存过期时间到了,自动失效。

请求b 查询缓存,发缓存中没有数据,查询数据库的旧值,但由于网络原因卡顿了,没有来得及更新缓存。

请求a 先写数据库,接着删除了缓存。

请求b 更新旧值到缓存中。

这种情况发生的可能性很少.

7.1.5.删除缓存失败怎么办?

7.1.5.1.定时

  1. 当用户操作写完数据库,但删除缓存失败了,需要将用户数据写入重试表中。如下图所示:

  2. 在定时任务中,异步读取重试表中的用户数据。重试表需要记录一个重试次数字段,初始值为0。然后重试5次,不断删除缓存,每重试一次该字段值+1。如果其中有任意一次成功了,则返回成功。如果重试了5次,还是失败,则我们需要在重试表中记录一个失败的状态,等待后续进一步处理。

  3. 在高并发场景中,定时任务推荐使用elastic-job。相对于xxl-job等定时任务,它可以分片处理,提升处理速度。同时每片的间隔可以设置成:1,2,3,5,7秒等。

7.1.5.2.MQ

  1. 当用户操作写完数据库,但删除缓存失败了,产生一条mq消息,发送给mq服务器。

  2. mq消费者读取mq消息,重试5次删除缓存。如果其中有任意一次成功了,则返回成功。如果重试了5次,还是失败,则写入死信队列中。

  3. 推荐mq使用rocketmq,重试机制和死信队列默认是支持的。使用起来非常方便,而且还支持顺序消息,延迟消息和事务消息等多种业务场景。

–7.1.5.3.binlog

监听binlog,比如使用:canal等中间件。


http://www.inspinia.net/a/16614.html

相关文章

yolov7模型部署——环境搭建(python 导出onnx模型,c# OnnxRunTime-GPU版调用) 踩坑记录

一,导出onnx模块 1.1 运行python .\export.py导出onnx模块 yolov7提供了简单的点对点预测,不需要再重新写NMS,非常方便,于是当然采用--end2end方法啦,命令如下图: 运行时发现没装onnx, 那就安装好了 1.2 …

1186: 奖学金(结构体专题)

题目描述 某校发放奖学金共5种,获取条件各不同: 1.阳明奖学金,每人8000,期末平均成绩>80,且在本学期发表论文大于等于1篇; 2.梨洲奖学金,每人4000,期末平均成绩>85&#xff…

Transformer8

太火了都说到第8了~~ 其实有点重复了 作为之前补充把 该怎么把预训练Transformer范式用到强化学习里?DeepMind提出「算法蒸馏」:可探索的预训练强化学习Transformer sformer模型可以将prompt作为条件或上下文学习(in-context learning&…

产业“上链”至深处,京东云如何作为?

在云南澜沧,盛产茶叶、咖啡豆,京东云帮助澜沧县搭建了冷链物流信息交易运营平台,聚合了生产、加工、运输、配送资源,联通产地、销地,汇聚供需信息,构建上行下行一张网,盘活了当地特色产业存量&a…

【Pytorch Lighting】第 2 章:第一个深度学习模型起步

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

浪漫3D樱花漫天飞舞特效【附源码】

免费领取源码参考 【浪漫3D樱花漫天飞舞特效】 博主介绍: 🚀自媒体 JavaPub 独立维护人,全网粉丝15w,csdn博客专家、Java领域优质创作者,51cto TOP10博主,知乎/掘金/华为云/阿里云/InfoQ等平台优质作者、专…

java中的接口

文章目录1、为什么会存在接口2、定义接口3、接口继承4、接口实现5、三个常用接口5.1 Comparable5.2 Comparator5.3 Cloneable1、为什么会存在接口 接口是抽象方法和常量值定义的集合,是抽象类的更近一步 一方面,有时必须从几个类中派生出一个子类&…

【生日快乐】Node.js 实战 第1章 欢迎进入Node.js 的世界 1.2 ES2015、Node 和 V8

Node.js 实战 文章目录Node.js 实战第1章 欢迎进入Node.js 的世界1.2 ES2015、Node 和 V81.2.1 Node 和 V81.2.2 使用特性组1.2.3 了解Node 的发布计划第1章 欢迎进入Node.js 的世界 1.2 ES2015、Node 和 V8 对于“以前的JavaScript” ,Node解决了很多问题&#x…

Excel - 字符串处理函数:LEFT, RIGHT, MID, LEN 和 FIND

Excel字符串处理函数:LEFT, RIGHT, MID, LEN 和 FIND。 我们在Excel里会存储一些字符串,其内容一般包含:字符、数字、符号(比如横线符 "-"),以及空格等。 如果我们需要从中要获取一部分内容,那如何在Excel中…

深入理解Java虚拟机:Java运行内存结构

本篇内容包括:JAVA 运行内存结构,即 程序计数器、Java 虚拟机栈、本地方法栈 、Java堆、方法区、运行时常量池 以及 直接内存等相关内容! 一、JAVA 运行内存结构 Jvm 执行 Java 程序时,会把它所管理的内存划分为若干个不同的数据…

你的Web3域名 价值究竟何在?

当你又一次听说某 Web3 域名被卖出天价的时候,当你又一次看到身边一位 Web3 朋友改用域名作为其用户名的时候,当你开始在注册栏中物色自己感兴趣的域名的时候,你是否有深思,这些域名究竟有么用?不同项目之前的区别和联…

MySQL去重中 distinct 和 group by 的区别

今天在写业务需要对数据库重复字段进行去重时,因为是去重,首先想到的是distinct关键字。于是一小时过去了。。。。(菜鸟一个,大家轻点骂) 我把问题的过程用sql语句演示给大家演示一下 首先我使用的是mybatis-plus&am…

【scrapy、flask】如何在社区版 PyCharm 中调试 scrapy爬虫和 flask web 服务

软件版本 PyCharm 2020.2 (Community Edition) ,此为官网上的免费社区版Windows 10 操作系统 调试 scrapy 爬虫 编写 scrapy 爬虫启动的入口文件如下: import os import sysfrom scrapy.cmdline import executesys.path.append(os.path.dirname(os.pat…

70.qt quick-QQmlListProperty详解

qml与c++少不了类表传递、比如我们之前的好友列表、文件传输列表等等、用的是QListModel、QList类指针表传递、QVariantList等、本章我们使用一个新的传递方式QQmlListProperty、 本章源码已上传至专栏群(第一章底部获取)中,感兴趣的自行下载、 1. QQmlListProperty介绍 QQml…

【生日快乐】SpringBoot SpringBoot 提高篇(第二篇) 第6章 SpringBoot 高级配置 6.1 临时属性配置

SpringBoot 【千锋教育java教程SpringBoot2全套,springboot快速入门到项目实战视频教程】 SpringBoot 提高篇(第二篇) 第6章 SpringBoot 高级配置 文章目录SpringBootSpringBoot 提高篇(第二篇)第6章 SpringBoot 高级配置6.1 临时属性配置6.1 临时属性配置 创建…

比Linus更牛逼的程序员,QEMU、FFmpeg的作者

Linus Torvalds是个非常厉害的程序员,因为他有两个名扬天下的作品:Linux和Git。 如果单论技术能力,有一个人,也许比Linus更强。 我在看他主页项目列表的时候,感觉头都炸了。 他开发了著名的模拟器QEMU和音视频处理库…

软考重点10 知识产权

软考重点10 知识产权一、著作权1. 著作权的理解(1)版权:(2)人身权与财产权2. 知识产权的归属判定3. 知识产权的归属判定(1)委托创作(2)合作开发4. 著作权保护对象及范围5…

Python数学基础2

1.Python中使用对数函数 log(x)就是数学中的ln(x),log10(x)就是数学中的lg(x)。 import numpy as np #对XY取ln X np.log(X) # 对X,Y取双对数 Y np.log(Y…

mac拷贝文件到u盘,mac拷贝文件到u盘很慢

初次接触Mac电脑的小伙伴可能对U盘的使用方法较为陌生,因为Mac电脑和Windows电脑存在操作差异,很多用户都不知道mac拷贝文件到u盘的操作方法,本文就来向大家介绍一下mac怎么拷贝到u盘。如果遇到了无法拷贝的情况,本文也会教大家怎…

linux文件查看和文件查找

一、例题 1. 文件查看 复制/etc/passwd到/opt目录下。 查看/opt/passwd文件的第6行 2.文件查找 在当前目录及子目录中,查找大写字母开头的txt文件 在/etc及其子目录中,查找host开头的文件 在$HOME目录及其子目录中,查找所有文件 在当前目录…