你真的了解缓存吗?(2)

news2024/9/20 14:43:52

在上一篇文章你真的了解缓存吗?(1)中,我介绍了引入缓存的利与弊,以及在选择一款缓存中间件时应该注意什么。在这一篇文章中,我们继续介绍在不同的业务场景下,如何进行缓存的选择,具体来说就是缓存的分类,和在使用缓存的过程中可能遇到的问题。

缓存的分类

在我们实际工作中,经常使用的缓存主要分为两类:进程内缓存和分布式缓存。

进程内缓存

进程内缓存主要是指使用和应用程序同一进程的内存来作为缓存的存储空间,因为和应用程序在同一个进程中,所以数据访问的过程不涉及网络开销,访问速度快。但是不足之处在于该进程内缓存的数据,无法被其他节点共享,同时,缓存本身和应用程序使用相同内存资源,两者之间会资源的相互竞争。

现如今大部分应用系统为了应对海量的用户访问,都会采用分布式的方式进行部署,一个应用程序会部署在多个节点上。对于分布式应用场景下,进程内缓存的不足之处就比较明显了,在这种场景下,我们更多的使用分布式缓存。

分布式缓存

分布式缓存,顾名思义,就是将缓存数据存储在多个节点中,实现缓存数据被应用程序的多个节点共享的能力。

而要实现缓存数据被多个节点共享,常用的实现方式有两种:

1.将需要缓存的数据集中存放到独立于应用程序之外第三方系统中,这样应用程序的多个节点都从第三方缓存系统中访问缓存数据。

2.仍然采用进程内缓存的实现方式,但需要将多个节点的进程内缓存数据相互同步,保证各个节点内的缓存数据是相同的,当有缓存数据变更时,会触发数据同步操作。

实现分布式缓存的这两种方式有一个共同特点:都需要涉及到网络IO,相比进程内缓存操作,数据处理效率会低一些。

根据分布式缓存实现的方式不同,分布式缓存可以分为两类:复制式缓存集中式缓存

复制式缓存

对于复制式缓存,我们可以将它看作:支持分布式缓存的进程内缓存。

复制式缓存实现过程是这样的:缓存中的所有数据,在应用程序集群中的每个节点里面都存有一个副本,当应用程序需要访问缓存数据时,直接从所在节点的进程中直接获取。

当应用程序需要更新数据时,更新的数据除了写到当前进程的内存中,还需将数据更新同步到其他节点中,数据同步的过程会涉及到大量的网路IO,数据变更成本比较大,当集群中的节点越多,数据更新的成本就越大。

在这里插入图片描述

除此之外,因为每个节点都会处理数据的读写,和我们常用的主从架构还不太一样,对主从架构不了解的小伙伴可以参考"如何让mysql存储海量数据"。多节点都支持读写的方式,数据一致性比较难以保证,或者需要耗费比较大的代价才能实现数据一致性。

复制式缓存的代表JbossCache,很多小伙伴应该都没有听说过它吧,是的,为了保证数据一致性,JbossCache的数据写入性能太低了,尤其在大规模集群中,根本无法使用,想进一步了解JbossCache的小伙伴可以参考 https://jbosscache.jboss.org/

集中式缓存

集中式缓存是目前分布式缓存的主流实现方式。集中式缓存将缓存数据集中存储在一个独立于应用集群之外的系统中,说到这里,很多小伙伴就应该会想到我们常用的缓存系统:redis,memcache等。

在这里插入图片描述

在使用集中式缓存时,无论数据读写,都需要网络访问,但是好处是,数据读写性能不会随着集群中节点数量的增加而受到的影响。

集中式缓存将数据独立存储的实现方式,在数据存储格式上,通常会采用一种与语言弱相关的存储格式。

也就是说集中式缓存通常可以为其他异构语言的应用程序提供服务。比如说C语言编写的redis可以为Java语言的应用程序提供服务,不同语言的应用程序使用redis提供的对应语言api组件即可,这些api组件会完成不同语言数据格式和redis需要的数据格式的序列化转换。

不过这种独立存储的缺点也很明显,因为在数据格式与语言无关,所以缓存系统在数据格式选择上要尽量通用一些,因此在表达一些像对象这种复杂数据类型的数据时,就比较困难。在redis中只能使用Hash这种类型,来部分模拟对象类型。

而在这一点上,进程内缓存的优势就比较明显了,进程内缓存数据的读写,都不会涉及到序列化和反序列化,这也是数据访问效率比较高的一个原因。

上面我们介绍了缓存的两种分类,主要有进程内缓存和分布式缓存,两种缓存各有优缺点,两者之间更多是互补的关系,而非替换。

我们在实际工作中,经常会将两者配合使用:使用进程内缓存作为一级缓存,分布式缓存作为二级缓存。在数据访问时,如果在一级缓存中查询到结果就直接返回,否则就到二级缓存中查询,再将二级缓存中的结果回填到一级缓存中,如果二级缓存中也无法查到结果的话,那么就回源到最终数据源,然后再将数据源回填到一、二级缓存中。

这种使用进程内缓存和分布式缓存的多级缓存方案,可以充分发挥两者的优势。

具体使用方式如下图所示:
在这里插入图片描述

使用缓存可能遇到风险

在之前的文章“什么是缓存和数据库一致性问题?”和“缓存问题“三件套“------- 雪崩,击穿与穿透”,我们有介绍在使用缓存过程中,会经常出现的一些问题,如:缓存穿透,缓存击穿,缓存雪崩和缓存数据不一致的问题。具体的问题以及解决方案,我们上面两篇文章中都有介绍,这里就不过多赘述了。

不过对于缓存一致性的问题,这里简单说一下自己的理解:

缓存系统设计的初衷,是为了缓解cpu和io压力,提升数据访问的性能。在分布式cap原则选择上,更侧重ap,所以从根本上来说,缓存系统自身并没有提供数据一致性的保证,而且为保证数据一致性而做得一些操作,也是违背缓存设计设计初衷的,因为保证数据一致性的操作,会影响数据读写的性能。

目前业内一些常用保证数据一致性的做法,也无法彻底解决数据一致性行问题,只能降低数据不一致的概率,否则的话我们也就不需要设计Paxos这样复杂的共识算法了。

所以,我们在选择一款中间件时,需要结合该中间件设计的初衷和要解决的场景问题,来做选型。在有更多选择的前提下,尽量不要去做在业务层面增强一款中间件功能特性的工作,因为我们之所以选择一款现成的中间件,而不是自己造轮子,主要就是为了提升工作效率,而非增加额外的工作量,否则就得不偿失了。

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

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

相关文章

嵌入式分享合集123

一、简易大功率变压器电路图 本文介绍的电子变压器克服了传统硅钢片变压器体积、重量大、效率低、价格高的缺点,电路成熟,性能稳定。 本电子变压器工作原理与开关电源相似,电路原理图见图1,由VD1-VD4将市电整流为直流&#xff0c…

书店管理系统(基于MySQL存储)

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

对标测评YD云电脑和天翼云电脑公众版

最近听说YD也推出了自研云电脑产品,抱着吃瓜心态网上充值体验了一把YD云电脑,正好我手上有天翼云电脑,凑一对测试看看两家央企在云计算领域的技术实力究竟如何。 测试环境搭建在我的个人pc上,分别下载YD云和天翼云电脑最新Windows…

[思维模式-3]:《如何系统思考》-3- 认识篇 - 什么是系统?系统的特征?

目录 第1章 什么是系统 1.1 万事万物都是一个有机的系统 1.2 系统的科学定义 1.3 系统的构成 1.4 系统的分类 第2章 动态复杂系统的八大特征 2.1 目的性 2.8 边界 2.3 结构影响行为 2.4 总体大于部分之和 2.5 因果互动 2.6 反馈 2.7 动态稳定性(动态自…

SAP ABAP 小工具 获取两个日期时间秒数和输出时间转换文本

SAP ABAP 小工具 获取两个日期时间秒数和输出时间转换文本 引言: 小工具 获取两个日期时间秒数和输出时间转换文本,用于加强用户交互直观性。 关键字:SAP ABAP 日期时间间隔 秒数 转换时间文本 文章目录SAP ABAP 小工具 获取两个日期时间秒…

[附源码]Python计算机毕业设计Django吾悦商城管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

计算机毕业设计springboot+vue基本微信小程序的小区防疫监管系统

项目介绍 编写工具用idea 、Maven包,后端数据库是mysql,Java语言,springboot框架。其间,在健康打卡位置和物资选购要调用接口才可实现其功能。 1、研究对象:小区居民普通用户和小区管理员 管理员权限:管理员是整个系统的操作者,系统的各个模块都能进行信…

python中pandas进行数据分析与可视化(3)

1.创建数据源 在前几篇博客中,都是手动创建少量数据充当数据源,这次通过随机生成,让数据量多一些 # 导入所有需要的库 import pandas as pd import numpy.random as np import openpyxl import xlrd import matplotlib.pyplot as plt#创建一…

Python基础 - 本地模块的绝对导入/引用

目录 1. 项目入口文件 2. 绝对导入 Python本地模块的引入是比较简单的,包括绝对引用和相对引用(相对引用的博客参考下一篇Python基础 - 本地模块的相对导入/引用),个人比较推荐使用绝对引用,会避免掉很多错误,本篇文章主要介绍绝…

【Javassist】快速入门系列01 使用Javassist实现Hello World

系列文章目录 01 使用Javassist实现Hello World 文章目录系列文章目录前言引入Javassist jar包使用Javassist实现Hello World总结说明前言 本篇文章为Javassist入门系列文章,适合了解Java基础语法的人零基础学会使用Javassist实现一个Hello World程序。 引入Javas…

国企招聘: 中国雄安集团2023校园招聘,面向全国,不限户籍

中国雄安集团有限公司2023年校园招聘公告 中国雄安集团有限公司(以下简称“中国雄安集团”)成立于2017年7月18日,是雄安新区开发建设的主要载体和运作平台。结合雄安新区建设需要,中国雄安集团布局金融与投资、城市发展与城市资源…

高低电平报警器-(模电、数电电子课程设计,毕业设计)Multisim仿真图

目录1 背景与意义1.1 研究背景1.2 研究内容1.3 技术指标2 电路设计2.1 各单元电路设计2.1.1 步进电源电路设计2.1.2 比较电路设计2.1.3 报警电路设计2.2 总体电路设计3 Multisim电路仿真与调试3.1仿真过程3.1.1 步进电源仿真调试3.1.2 总体电路仿真与调试3.2仿真结果分析4 总结…

Java项目:SSM婚纱影楼摄影商城项目网站

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 管理员角色包含以下功能: 管理员登录…

R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

R语言 R语言学习笔记——高级篇:第十四章-主成分分析和因子分析 文章目录R语言前言一、R中的主成分和因子分析二、主成分分析2.1、判断主成分的个数2.2、提取主成分2.3、主成分旋转2.4、获取主成分得分三、探索性因子分析3.1、判断需提取的公共因子数3.2、提取公共…

uboot启动流程

目录 1. 从汇编到C语言 1. 从汇编到C语言 uboot整个程序的入口是 ./arch/arm/lib/vectors.S 的 start 其中,reset 来自于 ./arch/arm/cpu/armv7/start.S, ./arch/arm/cpu/armv7/start.S 程序的执行路径为 reset --> save_boot_params_ret --> cp…

【C语言数据结构(基础版)】第四站:栈和队列

目录 一.栈的表示和实现 1.栈的概念及结构 2.栈的实现 二、栈的实现 1.栈的声明和定义 2.栈的初始化 3.栈的销毁 4.入栈 5.出栈 6.返回栈顶元素 7.返回栈的元素个数 8.栈是否为空 9.测试 三、栈的完整代码 四、队列的表示和实现 1.队列的概念和结构 2.队列的实现…

光环:工业互联网探索及案例——杨宝刚

摘要:文章内容主要来源于光环国际2022年第三届中国科创者大会杨宝刚老师的分享,原分享名称为"工业互联网助力企业数智化转型"。讲述了工业互联网概念及用友锅炉的一个实例运用。业互联网是一个整合平台,把你的需求告诉平台&#xf…

比亚迪携手亚洲足球小姐王霜发布品牌广告:为梦想,一路向前

在世界杯进入半决赛的最后一天——12月15日,比亚迪发布了全新的品牌宣传片《为梦想,一路向前》:携手亚洲足球小姐王霜,通过足球与梦想的故事,向每一位勇敢前行的追梦人致敬。业内几乎所有人都肯定了此次合作&#xff0…

java基于微信小程序的点餐系统-计算机毕业设计

开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:…

JavaEE【Spring】:SpringMVC 程序开发

文章目录一、概念1、MVC 定义2、MVC 和 Spring MVC 的关系3、Spring MVC 和 Spring 的关系二、Spring MVC 创建和连接1、创建 Spring MVC 项目① 对比② 注意2、RequestMapping 注解介绍3、RequestMapping 是 post 还是 get 请求?① GET② POST4、GetMapping 和 Pos…