缓存的设计方式

问题情况:

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

尤其是对于在海量数据中进行数据操作的时候,如果都是从 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.rhkb.cn/news/104223.html

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

相关文章

【Winform学习笔记(九)】Winform窗体程序延迟函数

Winform窗体程序延迟函数 前言正文1、具体代码2、使用示例 前言 Winform 窗体程序开发时,有时需要程序延迟或休眠几秒,如果直接使用 Thread.Sleep() 方法,会造成程序的假死,UI 界面停止响应; 本文中主要介绍一种方法&…

VB.NET调用VB6封装在OCX控件中的函数

将功能函数封装于OCX之中在VB6平台上可以简单化,在默认模板中直接考贝贴入那些函数即可。在博文【将《VB6编程IEEE浮点算法实践》中的Function封装成OCX】将《VB6编程IEEE浮点算法实践》中的Function封装成OCX_Mongnewer的博客-CSDN博客中对VB6的OCX封装做了具体实践…

keepalived+lvs(DR)(四十六)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、作用 二、调度器配置 三、web节点配置 一、作用 使用keepalived解决lvs的单点故障 高可用集群 二、调度器配置 安装keepalived yum install -y k…

OVRL-V2: A simple state-of-art baseline for IMAGENAV and OBJECTNAV 论文阅读

论文信息 题目:OVRL-V2: A simple state-of-art baseline for IMAGENAV and OBJECTNAV 作者:Karmesh Yadav, Arjun Majumdar, Ram Ramrakhya 来源:arxiv 时间:2023 代码地址: https://github.com/ykarmesh…

whisper 语音识别项目部署

1.安装anaconda软件 在如下网盘免费获取软件: 链接:https://pan.baidu.com/s/1zOZCQOeiDhx6ebHh5zNasA 提取码:hfnd 2.使用conda命令创建python3.8环境 conda create -n whisper python3.83.进入whisper虚拟环境 conda activate whisper4.…

vue uniapp 同意验证码滑块验证

前言 &#xff08;vue-puzzle-vcode&#xff09; 发送验证码以及登录的时候会做验证&#xff0c;防止机刷等 效果图 一、安装依赖 npm install vue-puzzle-vcode --save二、使用步骤 1.html使用 <Vcode :show"isShow" success"onSuccess"/>2.j…

数据降维 | MATLAB实现T-SNE降维特征可视化

数据降维 | MATLAB实现T-SNE降维特征可视化 目录 数据降维 | MATLAB实现T-SNE降维特征可视化降维效果基本描述程序设计参考资料 降维效果 基本描述 T-SNE降维特征可视化&#xff0c;MATLAB程序。 T-分布随机邻域嵌入&#xff0c;主要用途是对高维数据进行降维并进行可视化&…

Anolis 8.6 下 Redis 7.2.0 集群搭建和配置

Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵…

SpringCloud学习笔记(六)_Ribbon服务调用

Ribbon介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说&#xff0c;就是…

java八股文面试[Spring]——如何实现一个IOC容器

什么是IOC容器 IOC不是一种技术&#xff0c;只是一种思想&#xff0c;一个重要的面向对象编程的法则&#xff0c;它能指导我们如何设计出松耦合&#xff0c;更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象&#xff0c;从而导致类与类之间高耦合&#xff0c;难于…

生成式人工智能的潜在有害影响与未来之路(三)

产品责任法的潜在适用 背景和风险 产品责任是整个二十世纪发展起来的一个法律领域&#xff0c;旨在应对大规模生产的产品可能对社会造成的伤害。这一法律领域侧重于三个主要危害&#xff1a;设计缺陷的产品、制造缺陷的产品和营销缺陷的产品。产品责任法的特点有两个要素&…

LinkedList的顶级理解

目录 1.LinkedList的介绍 LinkedList的结构 2.LinkedList的模拟实现 2.1创建双链表 2.2头插法 2.3尾插法 2.4任意位置插入 2.5查找关键字 2.6链表长度 2.7遍历链表 2.8删除第一次出现关键字为key的节点 2.9删除所有值为key的节点 2.10清空链表 2.11完整代码 3.…

聚观早报 | 云鲸扫拖机器人J4体验;芯科科技第三代无线开发平台

【聚观365】8月24日消息 云鲸扫拖机器人J4体验 芯科科技推出第三代无线开发平台 英伟达与VMWare宣布扩大合作 万物新生&#xff08;爱回收&#xff09;2023年二季度财报 充电桩需求增长带动汽车后服务市场 云鲸扫拖机器人J4体验 家庭卫生清洁是每个人都无法回避的事情&am…

Unity 类Scene窗口相机控制

类Scene窗口相机控制 &#x1f354;效果 &#x1f354;效果 传送门&#x1f448;

疫情下社区管理系统的设计与实现(论文+源码)_kaic

疫情下社区管理系统 摘 要&#xff1a;新冠疫情下的社区人员管理系统是基于SpringBoot搭建的一套前后端分离系统。面向疫情下的社区管理人员和社区用户&#xff0c;主要用于进行社区服务&#xff0c;进行高效的社区人员管理。具有一定的经济效益和社会效益。本文分析了新冠疫情…

上门服务系统|上门服务小程序如何提升生活质量?

上门服务其实就是本地生活服务的升级&#xff0c;上门服务包含很多行业可以做的。例如&#xff1a;厨师上门、上门家电维修、跑腿等等。如今各类本地化生活服务越来越受大家的喜爱。基于此市场愿景&#xff0c;我们来谈谈上门服务系统功能。 一、上门服务系统功能 1、预约服务…

美创科技“签”手柠檬文才学堂,共推高校数据安全建设

近日&#xff0c;由柠檬文才学堂联合中国教育在线、东北财经大学网络教育学院共同主办的“三教统筹下高校继续教育数字化转型研讨”顺利召开。 国内高等院校&#xff08;高职院校&#xff09;继续教育分管领导&#xff0c;继续教育学院领导及继续教育信息化、教学教务管理、课程…

IP库新增经过实践的Verilog 库

网上严重缺乏实用的 Verilog 设计。Project F 库是尝试让 FPGA 初学者变得更好部分。 设计包括 Clock- 时钟生成 (PLL) 和域交叉Display - 显示时序、帧缓冲区、DVI/HDMI 输出Essential- 适用于多种设计的便捷模块Graphics- 绘制线条和形状Maths- 除法、LFSR、平方根、正弦....…

C语言练习1(巩固提升)

C语言练习1 选择题 前言 “人生在勤&#xff0c;勤则不匮。”幸福不会从天降&#xff0c;美好生活靠劳动创造。全面建成小康社会的奋斗目标&#xff0c;为广大劳动群众指明了光明的未来&#xff1b;全面建成小康社会的历史任务&#xff0c;为广大劳动群众赋予了光荣的使命&…

【填坑向】MySQL常见报错及处理系列(ERROR! The server quit without updating PID file)

本系列其他文章 【填坑向】MySQL常见报错及处理系列&#xff08;Communications link failure & Access denied for user ‘root‘‘localhost‘&#xff09;_AQin1012的博客-CSDN博客翻一下大致的意思就是默认会按照如下的顺序读取配置文件&#xff0c;我上面贴出的配置文…