缓存/内存

1 缓存是什么

缓存(Cache)指访问速度比一般随机存取存储器(RAM)快的以一种RAM,通常不像系统主存使用DRAM技术,使用SRAM技术.缓存指可进行高速数据交换的存储器,CPU最先从缓存获取数据,其次从内存取数据,因此缓存读写速度快于内存。
在软件与硬件的开发中,缓存有着不同的概念,若是纯硬件开发,缓存是指CPU中的缓存,若是软件开发,如Web开发,缓存指内存中的缓存,内存中的缓存用于提高响应速度、提高并发量、保护数据库和后台系统。

2 CPU缓存

CPU共有两个级别的缓存,即L1和L2缓存,解析如下表。

序号缓存级别描述
1L1 CacheL1 Cache(一级缓存)是CPU第一层高速缓存,内置的L1高速缓存的容量和结构对CPU的性能影响最大,不过高速缓冲存储器均由静态RAM组成,结构复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做的太大,即一级缓存在CPU内部.一般,L1缓存容量通常在32~256KB
2L2 CacheL2 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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值