1 缓存是什么
缓存(Cache)指访问速度比一般随机存取存储器(RAM)快的以一种RAM,通常不像系统主存使用DRAM技术,使用SRAM技术.缓存指可进行高速数据交换的存储器,CPU最先从缓存获取数据,其次从内存取数据,因此缓存读写速度快于内存。
在软件与硬件的开发中,缓存有着不同的概念,若是纯硬件开发,缓存是指CPU中的缓存,若是软件开发,如Web开发,缓存指内存中的缓存,内存中的缓存用于提高响应速度、提高并发量、保护数据库和后台系统。
2 CPU缓存
CPU共有两个级别的缓存,即L1和L2缓存,解析如下表。
序号 | 缓存级别 | 描述 |
---|---|---|
1 | L1 Cache | L1 Cache(一级缓存)是CPU第一层高速缓存,内置的L1高速缓存的容量和结构对CPU的性能影响最大,不过高速缓冲存储器均由静态RAM组成,结构复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做的太大,即一级缓存在CPU内部.一般,L1缓存容量通常在32~256KB |
2 | L2 Cache | L2 Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片,内部芯片的二级缓存运行速度与主频相同,外部的二级缓存只有主频的一半.L2高速缓存也会影响CPU性能,原则是越大越好,普通台式机CPU的L2缓存一般为128KB–2MB或更高,笔记本,服务器和工作站的CPU二级缓存最高可达1MB~3MB |
2.1 CPU数据读取机制
当CPU要读取一个数据时,首先从缓存中查找,若找到则立即读取并送给CPU处理,若没有找到,就从内存中读取送给CPU,同时把这个数据所在的数据块调入缓存中,可以是以后对整块数据的读取都从缓存中进行,不必再调用内存.正是这样的读取机制,使CPU下一次要读取的数据90%都在缓存中,只有大约10%需要从内存读取,这大大节约了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待,即CPU读取数据:先缓存后内存.
2.2 RAM
随机存取存储器(Random Access Memory, RAM),也称主存(或内存),与CPU直接交换数据的内部存储器,可随时读写,速度很快.主存(Main Memory)计算机内最主要的存储器,用于加载各种程序与数据以供CPU直接运行与使用.RAM分为两种,静态RAM(SRAM)和动态RAM(DRAM),静态由于DRAM性价比高,且扩展性很好,是现代计算机主存的最主要部分.
RAM存储速度远高于动态RAM,现在使用的内存一般都是动态RAM,缓存一般是静态RAM,但是SRAM集成度低(存储相同的数据,SRAM体积是DRAM的6倍),价格高(同容量的RAM,SRAM高DRAM价格4倍),为提高系统性能,不扩大原来SRAM,增加高速动态RAM作为缓存,这些高速动态RAM速度比常规动态RAM快,比原来静态RAM缓存慢,原来的静态缓存成为一级缓存,后增加的动态RAM称为二级缓存.
随着技术的发展,二级缓存也能集成在CPU内核中,容量也逐年提升,现在再用集成在CPU内部来定义一级,二级缓存已不确切,随着二级缓存被集成到CPU内核中,遗忘二级缓存与CPU大差距分频的情况也被改变(外部二级缓存为CPU主频的一半),现在以相同主频工作,为CPU提供更高的传输速度.
- 特点
- 随机存取
指当存储器中的数据被读取或写入时,所需要的时间与这段信息所在的位置或写入的位置无关,读取或写入顺序访问(Sequential Access)存储设备中的信息时,所需要的时间与位置有关系,主要用来存放操作系统,各种应用程序和数据等. - 易失性
当电源关闭时RAM不能保留数据,如需要保存数据,就需要将数据写入长期存储设备中(如硬盘),RAM和ROM相比,RAM断电后保存的数据会自动消失,ROM不会自动消失,可长时间断电存储. - 对静电敏感
随机存储器对环境的静电荷非常敏感,静电会干扰存储器内电容器的电荷,可使数据流失,甚至烧坏电路,因此触碰随机存取存储器前,应先用收触摸金属排除身体静电. - 访问速度
现代的随机存储器几乎是所有设备中写入和读取速度最快的,存取延迟和其他涉及机械运作的存储设备相比,也显得微不足道. - 需要刷新(再生)
现代的随机存储器依赖电容器存取数据,电容器充满电后(1表示),未充电的(0表示),由于电容器有漏电情形,如果不做特别处理,数据会渐渐随时间流失,刷新是指定期读取电容状态,然后按照原来状态重新作为电容充电,弥补流失的电荷,需要刷新也解释了随机存取器的易失性
2.3 ROM
只读存储器(Read Only Memory, ROM)只能读取事先存储数据的固态半导体存储器,一旦存储资料就无法改变或删除.分支:
- PROM
- EPROM
- OTPROM
- EEPROM
2.4 SRAM
静态随机存取存储器(Static Random-Access Memory,SRAM)在上电情况下,存储器中的数据可以永久保存,不更新,因此SRAM性能较高,但是断电之后,存储器中的数据仍会清除,并且体积较大,使得SRAM的集成度较低。SRAM主要用于二级缓存,速度快,但是价格高,体积较DRAM大。
2.5 DRAM
动态随机存取存储器(Dynamic Random-Access Memory,DRAM)上电情况下,数据周期性更新,数据在上电情况下不是永久存储,因此性能较SRAM低,耗电大,但是,DRAM体积小,集成度高,成本低,DRAM性价比较高。
3 内存缓存
本部分主要讲解内存中的缓存以及内存缓存相关的问题。
3.1 缓存击穿(热点数据集中失效)
- 描述
内存中某时刻t1之前存在查询的数据,t1时刻之后该数据过期,t1时刻请求数据,这种情况为缓存击穿(t1时刻刚好是数据过期节点,所有请求集中向持久层数据库发起)。 - 特点
在内存数据过期时刻请求数据。
3.2 缓存穿透
- 描述
缓存没有查询的数据,所有数据请求向持久层数据库发起,而持久层数据库亦没有查询的数据,这种情况为缓存穿透。 - 特点
内存和持久层中均不存在查询数据,内存不起作用。 - 解决方案
缓存空值,当持久层数据库中无查询的值时,返回空值(null),存入缓存中,有效时间设置短一些,否则影响正常使用。
3.3 缓存雪崩
- 描述
缓存出现异常,所有数据请求全部涌向持久层数据库,持久层数据库宕机。 - 特点
缓存异常,造成持久层数据库异常。 - 解决方案
序号 | 方案 |
---|---|
1 | 高可用(集群方式部署缓存) |
2 | 限流降级(缓存失效后,通过加锁或队列控制持久层数据库读写数量) |
3 | 数据预加载(先加载部分数据) |
4 | 设置不同的过期时间 |
5 | 热点数据永远不过期 |
3.4 内存问题
- 内存泄露:程序申请内存后,无法释放已申请的内存空间
- 内存溢出:程序申请内存时,没有足够的内存空间供程序使用
- 内存泄露方式(原因):
(1)常发性内存泄漏:发生内存泄露的代码会多次执行时,每次执行都会导致一块内存泄露;
(2)偶发性内存泄露:发生内存泄露的代码只在某些特定环境或操作过程下发生;
(3)一次性内存泄露:发生内存泄露的代码只被执行一次,或者由于算法上的缺陷,导致总会有且仅有一块内存泄露;
(4)隐式内存泄露:程序运行过程中,不断分配内存,直到程序运行结束才释放内存,严格来说,并不是内存泄露,但是,若该程序运行时间较长,比如运行几个月或几年,最终会导致内存耗尽,此时会导致内存泄露; - 内存溢出原因:
(1)内存中加载的数据量过于庞大,如一次从数据库中取的数据量超过可用内存存储空间;
(2)集合类中有对象的引用,使用后未清空,JVM不能回收;
(3)代码存在死循环或循环产生过多重复的对象实例;
(4)启动参数内存值设定过小; - 内存溢出解决方案:
(1)修改JVM启动参数,直接增加内存(-Xms,-Xmx)
(2)检查错误日志;
(3)检查代码;
4 缓存问题解决方案
缓存问题解决方案有多种,简单介绍常用的几种方法,如下表。
序号 | 方案 | 描述 |
---|---|---|
1 | 降级 | 基本可用的思想,保证重要服务正常运行,暂停或关闭次要服务 |
2 | 熔断 | 整体可用思想,保证整个系统正常运行,当某个服务出现过载是,关闭过载的服务 |
3 | 限流 | 整体可用思想,保证整体系统正常运行,限制服务访问次数,常用方法有计数器、漏桶和令牌桶算法 |
【参考文献】
[1]https://mp.weixin.qq.com/s/5MloHIa5zKvYYsVVEWZjQA
[2]https://baike.baidu.com/item/SRAM/7705927?fr=aladdin
[3]https://baijiahao.baidu.com/s?id=1655304940308056733&wfr=spider&for=pc
[4]https://blog.csdn.net/qq_19154605/article/details/104302302?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-10&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-10
[5]https://blog.csdn.net/weixin_34381666/article/details/91858168
[6]https://www.cnblogs.com/ziyoublog/p/10381750.html