缓存的设计方式

news2024/11/22 7:27:46

问题情况:

当有大量的请求到内部系统时,若每一个请求都需要我们操作数据库,例如查询操作,那么对于那种数据基本不怎么变动的数据来说,每一次都去数据库里面查询,是很消耗我们的性能

尤其是对于在海量数据中进行数据操作的时候,如果都是从 DB 中进行加载,那这是在挑战用户的耐性

简单来看,例如我们要去小区里面了解一个人在不在家,当没有通讯工具的前提下,我们每一次都要经过小区们的保安,然后再到具体的单元楼,最终到了这家门口,最终才知道在不在家

如果我们换了一个比较优秀的保安,他知道当前小区里面的特定的家里面是否有人,那这个时候,如果我们直接去问小区保安,自然就无需跑冤枉路了,自然就提高了效率

此处简单的就可以将优秀保安看做是一个缓存,我们每一次去访问,就会先去访问缓存 , 这样就能极大的提高访问效率和系统性能

可以看出,有一个优秀的保安相当重要

缓存的基本设计方式是什么样的

设计缓存自然也是为了解决系统是的低效问题,让系统可以高性能,高并发

例如我们直接访问单机的数据库如mysql 也就是上千级别的 qps,如果是访问 缓存的时候,就能达到上万,上十几万,这差距不是一点半点,是一个质的飞越

缓存的设计实际上就是 DB 和 缓存操作顺序以及谁来操作的事情,大体分为如下 4 种模式

  • Cache Aside
  • Read Through
  • Write Through
  • Write Behind Caching

上述四种模式, Cache Aside 用的方式是最常使用的,咱们后续细说

后续三种模式的含义是

Read Through

  • 是在查询操作的时候更新缓存,若缓存失效了,则是由缓存服务器自己将数据加载到缓存中

Write Through

  • 是在更新数据库的时候,如果命中了缓存,则先更新缓存,再由缓存服务器自己去更新数据,
  • 如果是没有命中缓存,那么就直接更新数据库

Write Behind Caching 通过名字我们知道,是在写到缓存操作之后才做些操作,实际上这种模式只更新缓存,不会更新数据库,缓存服务器会以异步的方式将数据批量更新到数据库中

很明显,这种,模式速度自然会更快,可这种模式对于保证数据库和缓存数据一致性问题,是个硬伤,且还会存在丢数据的情况,比如,咱们的缓存服务器挂掉了

Cache Aside 读写缓存模式是怎么玩的

Cache Aside 读写模式缓存又是如何去处理的呢,一起来看看

Cache Aside 模式读取数据的逻辑是这个样子的:

读取数据时

  • 先读取缓存中的数据,如果缓存中有数据,则直接返回
  • 若缓存中没有数据,则去读数据库中的数据,并将数据同步到缓存中

写入数据时

  • 写入数据库,写入成功时,将缓存的数据删除掉

仔细的同学可能会思考并提出这样的问题,如果我一个查询操作,现在缓存中无数据,此时会去数据库中查询,在这个过程中,另外有一个写入数据库的操作,且操作完毕后,删除了缓存,这个时候,第一个操作实际上从数据库拿到的还是之前的老数据,并且会将数据放到缓存中,那么此时的数据实际上是一个老数据,也可以理解是在脏数据

这个点其实我们就无需担心了,大佬们已经论证过这种情况出现的概率极低

因为咱们的写表操作是要锁表的,且我们知道数据库写入操作比读取操作要慢,也就是说,当同时有一个读取和写入 DB 的操作时,自然是写入的操作是要后返回结果的,此处不要杠啥读写数据量不一致的情况,咱们做对比,自然是在同等条件下比较咯

从图中我们知道,同等条件下,先进行查询 DB 的操作,过程中,来了一个写入 DB 操作,自然是 查询操作先返回,写入操作再返回结果

其实此处,有的做法是,写入数据的时候,写入成功,同时也会将数据同步到缓存中

那么这种方式的引入,实际上从数据库到缓存就有了 2 种情况了,一个是查询操作,一个是写入操作,那么在实际操作中,我是可以加入分布式锁来进行处理,保证写入数据库的时候,同时也要写入缓存,数据才可访问,当然查询 DB 操作也是一样

缓存带来了哪些问题?

那么引入缓存除了可以带来高性能,高并发,自然也是有会带来一些问题的,例如:

  • 缓存击穿
  • 缓存穿透
  • 缓存雪崩

如上 3 中情况,都是由于缓存这一层防线失守了,导致外部请求以各种各样的形式,各种各样的原因打到了数据库上,导致出现的问题,详细的 缓存击穿,缓存穿透,缓存雪崩的出现情况,解决方式可以查看历史文章 redis 缓存穿透,缓存击穿,缓存雪崩

感谢阅读,欢迎交流,点个赞,关注一波 再走吧
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

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

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

相关文章

【0基础入门Python Web笔记】一、python 之基础语法、基础数据类型、复合数据类型及基本操作

一、python 之基础语法、基础数据类型、复合数据类型及基本操作 基础语法规则基础数据类型数字类型(Numbers)字符串类型(String)布尔类型(Boolean) 复合数据类型List(列表)Tuple&…

【C++代码】有序数组的平方,长度最小的子数组,螺旋矩阵 II--代码随想录

题目:有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 题解 数组其实是有序的, 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的…

shell 编写一个带有进度条的程序安装脚本

需求 使用 shell 写一个 软件安装脚本,带有进度条 示例 #!/bin/bash# 模拟软件安装的步骤列表 steps("解压文件" "安装依赖" "配置设置" "复制文件" "")# 计算总步骤数 total_steps${#steps[]}# 安装进度的初…

JVM——类加载与字节码技术—类加载器+运行期优化

5.类加载器 jdk的类加载器具有层级关系。 启动类加载器》扩展类加载器》应用程序类加载器》自定义类加载器 对应类加载器只会负责加载对应目录的类。 双亲委派上级机制 应用程序类加载器加载一个类之前会先查询上级加载器是否已经加载过了该类。然后再让上级询问上上级。都…

代码随想录算法训练营第四十四天|LeetCode 309,714

目录 LeetCode 309.最佳买卖股票时机含冷冻期 动态规划五步曲: 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 5.打印dp数组 LeetCode 714.买卖股票的最佳时机含手续费 动态规划五步曲: 1.确定dp[i]的含义 2.找出递推公式 3.初始…

项目构建工具:CMake的核心用法

Golang有go mod、Python有pip、Java有maven。但C语言没有这么好用的包管理工具。当然Conan大概可以算是一个,但其也有自身的局限性,使用起来并不简单。 这就导致我们在写C代码的时候,老是要把心思放在怎么构建项目上。比如有一个项目&#x…

重磅!亚马逊将于10月再次举行秋季会员大促!

今年亚马逊7月份的Prime Day大促出乎卖家意料,效果出奇之好,大促确实有提振销量和信心的奇效。 而在近期,亚马逊宣布,将在今年10月,继续为亚马逊Prime会员带来“Prime秋季会员大促”。 19个国家(包括澳大…

使用BeanShell写入内容到文件【JMeter】

一、前言 ​ 在我们日常工作中,可能会遇到需要将请求返回的数据写入到文件中。在我们使用JMeter进行性能测试时,就经常能够遇到这种情况。要想达到这种目的,我们一般采取BeanShell后置处理器来将内容写入到文件。 二、提取 ​ 在目前大多数的…

使用代理突破浏览器IP限制

一、实验目的: 主要时了解代理服务器的概念,同时如何突破浏览器IP限制 二、预备知识: 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站,特别是它具有一个cac…

【Python】从入门到上头—Python基础(2)

文章目录 一.基础语法1.编码2.标识符3.保留字4.注释5.行与缩进6.多行语句7.数字(Number)类型8.字符串(String)9.空行10.等待用户输入11.同一行显示多条语句12.多个语句构成代码组13.print 输出14.import 与 from...import 二.基本数据类型1.变量和赋值2.多个变量赋值3.标准数据…

win10某个软件字体模糊修复

1、在桌面找到该软件,右键选择属性,如下: 2、打开后选择兼容性--更改高DPI设置。 3、点击高DPI缩放替代--应用程序。 4、点击应用,然后退出属性设置。重新打开软件,发现软件字体变得清晰了。

MySQL 保存日期用哪种数据类型

写在前面 在设计数据库表时不可避免的需要用到时间类型,到底选择那种数据类型来表示时间是一个值的讨论的问题,本文就一起来看下! 1:能用哪些数据类型 1:字符串:不要用,占用空间大,至少需要19个字节&…

STM32CubeMx配置HAL库编码器测速

编码器概述 编码器是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系 列电信号。按照读出方式编码器可以分为接触式和非接触式两种;按照工作原理编码器可分为增量式和绝对式两类。编…

全局ID生成方式

全局ID生成方式 目录 1. 全局唯一id介绍 1.1 特点 2. 常见的全局唯一id生成策略 2.1 利用数据库自增字段生成id2.2 UUID2.3 Redis生成id2.4 zookeeper生成ID2.5 Twitter的snowflake算法 3. 面试题目:实现一个全局的ID生成器,注意线程安全 3.1 单例模式…

【PCL-9】AABB包围盒

当一个物体边与坐标轴平行时&#xff0c;生成的ABB最小外接立方体有偏差&#xff0c;故这里采用AABB算法。 示例代码&#xff1a; #include <pcl/features/moment_of_inertia_estimation.h> #include <vector> #include <pcl/io/pcd_io.h> #include <pc…

在 Pytorch 中使用 TensorBoard

机器学习的训练过程中会产生各类数据&#xff0c;包括 “标量scalar”、“图像image”、“统计图diagram”、“视频video”、“音频audio”、“文本text”、“嵌入Embedding” 等等。为了更好地追踪和分析这些数据&#xff0c;许多可视化工具应运而生&#xff0c;比如之前介绍的…

机器学习十大算法之七——随机森林

0 引言 集成学习&#xff08;ensemble learning&#xff09;是时下非常流行的机器学习算法&#xff0c;它本身不是一个单独的机器学习算法&#xff0c;而是通过在数据上构建多个横型&#xff0c;集成所有模型的建模结果&#xff0c;基本上所有的机器学习领域都可以看到集成学习…

华为OD机试 - 连续字母长度 - 字符串(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明4、再输入5、输出6、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08…

混币器——隐私交易的天堂,还是洗钱犯罪的聚集地?

据美国财政部官网&#xff0c;Tornado Cash 联创 Roman Storm 已被 FBI 和国税局逮捕&#xff0c;罪名是串谋洗钱、串谋经营未经许可的资金传输业务以及串谋违反制裁规定&#xff0c;另一创始人 Roman Semenov仍然在逃。 FBI局长Christopher A. Wray说&#xff1a;“今天的公告…

动物体外受精手术VR模拟仿真培训系统保证学生及标本的安全

奶牛是养殖业主要的资源&#xff0c;因此保证奶牛的健康对养殖业的成功和可持续发展具有重要已用&#xff0c;奶牛有一些常见易发病&#xff0c;一旦处理不当&#xff0c;对奶牛业都会造成较大的经济损失&#xff0c;传统的奶牛手术培训实操难度大、风险高且花费大&#xff0c;…