一级缓存和二级缓存是啥意思??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一级缓存和二级缓存是啥意思??相关的知识,希望对你有一定的参考价值。

许多人认为,“缓存”是内存的一部分

许多技术文章都是这样教授的

但是还是有很多人不知道缓存在什么地方,缓存是做什么用的

其实,缓存是CPU的一部分,它存在于CPU中

CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大

缓存是为了解决CPU速度和内存速度的速度差异问题

内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多

这里要特别指出的是:
1.因为缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速度就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。

2.因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,现在又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的

3.关于一级缓存和二级缓存
为了分清这两个概念,我们先了解一下RAM

ram和ROM相对的,RAM是掉电以后,其中才信息就消失那一种,ROM在掉电以后信息也不会消失那一种

RAM又分两种,

一种是静态RAM,SRAM;一种是动态RAM,DRAM。前者的存储速度要比后者快得多,我们现在使用的内存一般都是动态RAM。

有的菜鸟就说了,为了增加系统的速度,把缓存扩大不就行了吗,扩大的越大,缓存的数据越多,系统不就越快了吗

缓存通常都是静态RAM,速度是非常的快,

但是静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍),

价格高(同容量的静态RAM是动态RAM的四倍),

由此可见,扩大静态RAM作为缓存是一个非常愚蠢的行为,

但是为了提高系统的性能和速度,我们必须要扩大缓存,

这样就有了一个折中的方法,不扩大原来的静态RAM缓存,而是增加一些高速动态RAM做为缓存,

这些高速动态RAM速度要比常规动态RAM快,但比原来的静态RAM缓存慢,

我们把原来的静态ram缓存叫一级缓存,而把后来增加的动态RAM叫二级缓存。

一级缓存和二级缓存中的内容都是内存中访问频率高的数据的复制品(映射),它们的存在都是为了减少高速CPU对慢速内存的访问。
通常CPU找数据或指令的顺序是:先到一级缓存中找,找不到再到二级缓存中找,如果还找不到就只有到内存中找了
参考技术A 一级缓存(Level
1
Cache)简称L1
Cache,位于CPU内核的旁边,是与CPU结合最为紧密的CPU缓存,也是历史上最早出现的CPU缓存。由于一级缓存的技术难度和制造成本最高,提高容量所带来的技术难度增加和成本增加非常大,所带来的性能提升却不明显,性价比很低,而且现有的一级缓存的命中率已经很高,所以一级缓存是所有缓存中容量最小的,比二级缓存要小得多。
一般来说,一级缓存可以分为一级数据缓存(Data
Cache,D-Cache)和一级指令缓存(Instruction
Cache,I-Cache)。二者分别用来存放数据以及对执行这些数据的指令进行即时解码,而且两者可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。目前大多数CPU的一级数据缓存和一级指令缓存具有相同的容量,例如AMD的Athlon
XP就具有64KB的一级数据缓存和64KB的一级指令缓存,其一级缓存就以64KB+64KB来表示,其余的CPU的一级缓存表示方法以此类推。
二级缓存是CPU性能表现的关键之一,在CPU核心不变化的情况下,增加二级缓存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二级缓存上有差异,由此可见二级缓存对于CPU的重要性。
参考技术B 简单点。1级缓存现在一般集成在CPU内。。提供给CPU存放常用的命令来加快CPU的运算速度。。2级缓存一般集成在主板上。。和1缓存功能相同。。但是1级的速度远远大于2级 以后便是你的物理内存。然后在是你的虚拟内存。。当然物理内存一般都提供个系统。和应用程序。。虚拟内存主要就是提供给应用程序。总之一句话。缓存就是用来加快运算读去速度的..缓存大小要适当。太大会让查找的时候花费更多的时间。太小存放的指令太少。。适当才是真理。。1 2级小是应为那两样缓存的成本太高 参考技术C 其实在物理上看,1/2/3级缓存是属于cpu,但从逻辑上看,它们其实和内存是同样的,但是因为CPU速度远超内存,所以在内存和cpu之间加一层缓存提高cpu利用率。 参考技术D CPU缓存
(Cache
Memory)位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。由此可见,在CPU中加入缓存是一种高效的解决方案,这样整个
内存储器
(缓存+内存)就变成了既有缓存的高速度,又有内存的大容量的
存储系统
了。缓存对CPU的性能影响很大,主要是因为CPU的
数据交换
顺序和CPU与缓存间的带宽引起的。
缓存是为了解决CPU速度和
内存速度
的速度差异问题。内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多。
为了分清这两个概念,我们先了解一下RAM
。RAM和ROM相对的,RAM是掉电以后,其中的信息就消失那一种,ROM在掉电以后信息也不会消失那一种。
RAM又分两种,一种是静态RAM,SRAM;一种是动态RAM,DRAM。前者的存储速度要比后者快得多,我们现在使用的内存一般都是动态RAM。
有的菜鸟就说了,为了增加系统的速度,把缓存扩大不就行了吗,扩大的越大,缓存的数据越多,系统不就越快了吗?缓存通常都是静态RAM,速度是非常的快,
但是静态RAM
集成度
低(存储相同的数据,静态RAM的体积是动态RAM的6倍),
价格高(同容量的静态RAM是动态RAM的四倍),
由此可见,扩大静态RAM作为缓存是一个非常愚蠢的行为,
但是为了提高系统的性能和速度,我们必须要扩大缓存,
这样就有了一个折中的方法,不扩大原来的静态RAM缓存,而是增加一些高速动态RAM做为缓存,
这些高速动态RAM速度要比常规动态RAM快,但比原来的静态RAM缓存慢,
我们把原来的静态ram缓存叫
一级缓存
,而把后来增加的动态RAM叫二级缓存。
一级缓存和二级缓存中的内容都是内存中访问频率高的数据的复制品(映射),它们的存在都是为了减少高速CPU对慢速内存的访问。
通常CPU找数据或指令的顺序是:先到一级缓存中找,找不到再到二级缓存中找,如果还找不到就只有到内存中找了。

MyBatis 延迟加载,一级缓存,二级缓存设置

什么是延迟加载 

        resultMap中的association和collection标签具有延迟加载的功能。

        延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。使用关联信息时再去加载关联信息。


设置延迟加载

        需要在SqlMapConfig.xml文件中,在<settings>标签中设置下延迟加载。

        lazyLoadingEnabled、aggressiveLazyLoading

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true | false

true

 

1
2
3
4
5
6
7
8
9
10
<!-- 开启延迟加载 -->
    <settings>
        <!-- lazyLoadingEnabled:延迟加载启动,默认是false -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- aggressiveLazyLoading:积极的懒加载,false的话按需加载,默认是true -->
        <setting name="aggressiveLazyLoading" value="false"/>
         
        <!-- 开启二级缓存,默认是false -->
        <setting name="cacheEnabled" value="true"/>
    </settings>

 

 

 

 

什么是查询缓存

    

Mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSessionMybatis默认开启一级缓存

在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则SqlSession的缓存清空。

 

Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存

在同一个namespace下的mapper文件中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则二级缓存清空。

 

一级缓存原理

技术分享

一级缓存区域是根据SqlSession为单位划分的。

 

每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。Mybatis的内部缓存使用一个HashMap,keyhashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。

 

SqlSession执行insertupdatedelete等操作commit后会清空该SQLSession缓存。

 

二级缓存原理

技术分享

二级缓存是mapper级别的。Mybatis默认是没有开启二级缓存。

 

第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内。

第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息。会去对应的二级缓存内取结果。

如果调用相同namespace下的mapper映射文件中的增删改SQL,并执行了commit操作。此时会清空该namespace下的二级缓存。

 

开启二级缓存

1、  在核心配置文件SqlMapConfig.xml中加入以下内容(开启二级缓存总开关):

cacheEnabled设置为 true

技术分享

 

2、在映射文件中,加入以下内容,开启二级缓存:

技术分享

 

实现序列化

    技术分享

由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,所以需要给缓存的对象执行序列化。

如果该类存在父类,那么父类也要实现序列化。

 

禁用二级缓存

该statement中设置userCache=false可以禁用当前select语句的二级缓存,即每次查询都是去数据库中查询,默认情况下是true,即该statement使用二级缓存。

技术分享

刷新二级缓存

技术分享


以上是关于一级缓存和二级缓存是啥意思??的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的一级缓存和二级缓存分别是啥?

hibernate一级和二级缓存介绍

什么是一级缓存,什么是二级缓存?

一级缓存和二级缓存有啥区别

什么是缓存?一级缓存?二级缓存?

谁给我解释一下一级缓存和二级缓存啊~