精华内容
下载资源
问答
  • Redis用作二级缓存

    2018-06-04 21:51:03
    这个主要是用作在Mybatis中的Mapping文件中的二级缓存
  • CPU中的级缓存,二级缓存三级缓存

    千次阅读 多人点赞 2018-06-14 13:49:56
    CPU中的级缓存,二级缓存三级缓存 缓存又叫高速缓冲存储器,其作用在于缓解主存速度慢、跟不上CPU读写速度要求的矛盾。 缓存的实现原理,是把CPU最近最可能用到的少量信息(数据或指令)从主存复制到CACHE中,当...

           缓存又叫高速缓冲存储器,其作用在于缓解主存速度慢、跟不上CPU读写速度要求的矛盾。
           缓存的实现原理,是把CPU最近最可能用到的少量信息(数据或指令)从主存复制到CACHE中,当CPU下次再用这些信息时,它就不必访问慢速的主存,而直接从快速的CACHE中得到,从而提高了得到这些信息的速度,使CPU有更高的运行效率。
           缓存的工作原理:是当CPU要读取一个数据时,首先从缓存中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在缓存中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先缓存后内存。

           缓存的大小:一般说来,更大一点的cache容量,对提高命中率是有好处的,由于cache是用价格很高的静态存储器SRAM器件实现的,而cache容量达到一定大小后,再增加其容量,对命中率的提高并不明显,从合理的性能/价格比考虑,cache的容量设置应在一个合理的容量范围之内。

           缓存要分一级二级 三级,是为了建立一个层次存储结构,以达到最高性价比。而且多级组织还可以提高cache的命中率,提高执行效能。

           一般来说,一级缓存可以分为一级数据缓存(Data Cache,D-Cache)和一级指令缓存(InstructionCache,I-Cache)。二者分别用来存放数据以及对执行这些数据的指令进行即时解码,而且两者可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。
           目前大多数CPU的一级数据缓存和一级指令缓存具有相同的容量,例如AMD的Athlon。XP就具有64KB的一级数据缓存和64KB的一级指令缓存,其一级缓存就以64KB+64KB来表示,其余的CPU的一级缓存表示方法以此类推。并不是缓存越大越好,譬如AMD和INTER就有不同的理论,AMD认为一级缓存越大越好,所以一级比较大,而INTER认为过大会有更长的指令执行时间,所以一级很小,二级缓存那两个公司的理论又反过来了,AMD的小,INTER的大,一般主流的INTERCPU的2级缓存都在2M左右,我们通常用(L1,L2)来称呼。

           CPU缓存(CacheMemory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多,但是交换速度却比内存要快得多。缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。由此可见,在CPU中加入缓存是一种高效的解决方案,这样整个内存储器(缓存+内存)就变成了既有缓存的高速度,又有内存的大容量的存储系统了。缓存对CPU的性能影响很大,主要是因为CPU的数据交换顺序和CPU与缓存间的带宽引起的。
           根据数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是下一级缓存的一部分,这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。
           一般来说,每级缓存的命中率大概都在80%左右,也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、三级缓存或内存中读取,由此可见一级缓存是整个CPU缓存架构中最为重要的部分。

           目前缓存基本上都是采用SRAM存储器,SRAM是英文StaticRAM的缩写,它是一种具有静志存取功能的存储器,不需要刷新电路即能保存它内部存储的数据。不像DRAM内存那样需要刷新电路,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积,这也是目前不能将缓存容量做得太大的重要原因。
           它的特点归纳如下:优点是节能、速度快、不必配合内存刷新电路、可提高整体的工作效率,缺点是集成度低、相同的容量体积较大、而且价格较高,只能少量用于关键性系统以提高效率。

    展开全文
  • 大家都知道CPU缓存很重要,但对于缓存的具体细分却知之甚少,本文只要是关于CPU缓存的介绍,并着重描述了级缓存、二级缓存三级缓存区别方法。 CPU缓存 CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器...

    大家都知道CPU缓存很重要,但对于缓存的具体细分却知之甚少,本文只要是关于CPU缓存的介绍,并着重描述了一级缓存、二级缓存、三级缓存区别方法。

    CPU缓存

    CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先缓存中调用,从而加快读取速度。
    在这里插入图片描述
    CPU缓存的容量比内存小的多但是交换速度却比内存要快得多。缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。

    缓存大小是CPU的重要指标之一,而且缓存的结构和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存或者硬盘上寻找,以此提高系统性能。但是从CPU芯片面积和成本的因素来考虑,缓存都很小。

    按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是下一级缓存的一部分,这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。一般来说,每级缓存的命中率大概都在80%左右,也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、三级缓存或内存中读取,由此可见一级缓存是整个CPU缓存架构中最为重要的部分。

    一级缓存、二级缓存、三级缓存区别是什么?

    一级缓存、二级缓存、三级缓存是什么?作用?区别? 首先简单了解一下一级缓存。目前所有主流处理器大都具有一级缓存和二级缓存,少数高端处理器还集成了三级缓存。其中,一级缓存可分为一级指令缓存和一级数据缓存。一级指令缓存用于暂时存储并向CPU递送各类运算指令;一级数据缓存用于暂时存储并向CPU递送运算所需数据,这就是一级缓存的作用。 那么,二级缓存的作用又是什么呢?简单地说,二级缓存就是一级缓存的缓冲器:一级缓存制造成本很高因此它的容量有限,二级缓存的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。同样道理,三级缓存和内存可以看作是二级缓存的缓冲器,它们的容量递增,但单位制造成本却递减。

    需要注意的是,无论是二级缓存、三级缓存还是内存都不能存储处理器操作的原始指令,这些指令只能存储在CPU的一级指令缓存中,而余下的二级缓存、三级缓存和内存仅用于存储CPU所需数据。 根据工作原理的不同,目前主流处理器所采用的一级数据缓存又可以分为实数据读写缓存和数据代码指令追踪缓存2种,它们分别被AMD和Intel所采用。不同的一级数据缓存设计对于二级缓存容量的需求也各不相同,下面让我们简单了解一下这两种一级数据缓存设计的不同之处。

    一、AMD一级数据缓存设计 AMD采用的一级缓存设计属于传统的“实数据读写缓存”设计。基于该架构的一级数据缓存主要用于存储CPU最先读取的数据;而更多的读取数据则分别存储在二级缓存和系统内存当中。做个简单的假设,假如处理器需要读取“AMD ATHLON 64 3000+ IS GOOD”这一串数据(不记空格),那么首先要被读取的“AMDATHL”将被存储在一级数据缓存中,而余下的“ON643000+ISGOOD”则被分别存储在二级缓存和系统内存当中(如下图所示)。 需要注意的是,以上假设只是对AMD处理器一级数据缓存的一个抽象描述,一级数据缓存和二级缓存所能存储的数据长度完全由缓存容量的大小决定,而绝非以上假设中的几个字节。“实数据读写缓存”的优点是数据读取直接快速,但这也需要一级数据缓存具有一定的容量,增加了处理器的制造难度(一级数据缓存的单位制造成本较二级缓存高)。

    二、Intel一级数据缓存设计 自P4时代开始,Intel开始采用全新的“数据代码指令追踪缓存”设计。基于这种架构的一级数据缓存不再存储实际的数据,而是存储这些数据在二级缓存中的指令代码(即数据在二级缓存中存储的起始地址)。假设处理器需要读取“INTEL P4 IS GOOD”这一串数据(不记空格),那么所有数据将被存储在二级缓存中,而一级数据代码指令追踪缓存需要存储的仅仅是上述数据的起始地址。

    由于一级数据缓存不再存储实际数据,因此“数据代码指令追踪缓存”设计能够极大地降CPU对一级数据缓存容量的要求,降低处理器的生产难度。但这种设计的弊端在于数据读取效率较“实数据读写缓存设计”低,而且对二级缓存容量的依赖性非常大。 在了解了一级缓存、二级缓存的大致作用及其分类以后,下面我们来回答以下硬件一菜鸟网友提出的问题。

    从理论上讲,二级缓存越大处理器的性能越好,但这并不是说二级缓存容量加倍就能够处理器带来成倍的性能增长。目前CPU处理的绝大部分数据的大小都在0-256KB之间,小部分数据的大小在256KB-512KB之间,只有极少数数据的大小超过512KB。所以只要处理器可用的一级、二级缓存容量达到256KB以上,那就能够应付正常的应用;512KB容量的二级缓存已经足够满足绝大多数应用的需求。 这其中,对于采用“实数据读写缓存”设计的AMD Athlon 64、Sempron处理器而言,由于它们已经具备了64KB一级指令缓存和64KB一级数据缓存,只要处理器的二级缓存容量大于等于128KB就能够存储足够的数据和指令,因此它们对二级缓存的依赖性并不大。这就是为什么主频同为1.8GHz的Socket 754 Sempron 3000+(128KB二级缓存)、Sempron 3100+(256KB二级缓存)以及Athlon 64 2800+(512KB二级缓存)在大多数评测中性能非常接近的主要原因。所以对于普通用户而言754 Sempron 2600+是值得考虑的。 反观Intel目前主推的P4、赛扬系列处理器,它们都采用了“数据代码指令追踪缓存”架构,其中Prescott内核的一级缓存中只包含了12KB一级指令缓存和16KB一级数据缓存,而Northwood内核更是只有12KB一级指令缓存和8KB一级数据缓存。

    因此,P4、赛隆系列处理器非常依赖于二级缓存,赛扬D 320(256KB二级缓存)和赛扬2.4GHz(128kb二级缓存)的性能差距是很好的证明;Cayon D和P4E处理器之间的性能差距也非常明显。最后,如果你是一个狂热的游戏爱好者或者一个专业的多媒体用户,一个带有1MB二级缓存的P4处理器和一个512Kb/1MB二级缓存的Athon 64处理器是你的理想选择。由于CPU的主存和二级缓存在重计算负载下几乎是“满”的,大的二级缓存可以为处理器提供大约5%到10%的性能改进,这对于要求苛刻的用户是绝对必要的。一级缓存是在CPU内的,用来存放内部指令,2级缓存和CPU封装在一起,也是用来存放指令数据的,三级和四级缓存只在高端的服务器CPU里有,作用差不多,速度更快,更稳定,更有效 并不是缓存越大越好,譬如AMD和INTER就有不同的理论,AMD认为一级缓存越大越好,所以一级比较大,而INTER认为过大会有更长的指令执行时间,所以一级很小,二级缓存那两个公司的理论又反过来了,AMD的小,INTER的大,一般主流的INTERCPU的2级缓存都在2M左右 我们通常用(L1,L2)来称呼缓存又叫高速缓冲存储器其作用在于缓解主存速度慢、跟不上CPU读写速度要求的矛盾。它的实现原理,是把CPU最近最可能用到的少量信息(数据或指令)从主存复制到CACHE中,当CPU下次再用这些信息时,它就不必访问慢速的主存,而直接从快速的CACHE中得到,从而提高了得到这些信息的速度,使CPU有更高的运行效率。

    缓存的大小

    一般说来,更大一点的cache容量,对提高命中率是有好处的,如图4.20所示,由于cache 是用价格很高的静态存储器SRAM器件实现的,而cache容量达到一定大小这后,再增加其容量,对命中率的提高并不明显,从合理的性能/价格比考虑,cache的容量设置应在一个合理的容量范围之内。缓存要分一级二级 三级,是为了建立一个层次存储结构,以达到最高性价比。而且多级组织还可以提高cache的命中率,提高执行效能。

    CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。由此可见,在CPU中加入缓存是一种高效的解决方案,这样整个内存储器(缓存+内存)就变成了既有缓存的高速度,又有内存的大容量的存储系统了。缓存对CPU的性能影响很大,主要是因为CPU的数据交换顺序和CPU与缓存间的带宽引起的。 缓存的工作原理是当CPU要读取一个数据时,首先从缓存中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。 正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在缓存中,只有大约10%需要从内存读取。

    这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先缓存后内存。 目前缓存基本上都是采用SRAM存储器,SRAM是英文Static RAM的缩写,它是一种具有静志存取功能的存储器,不需要刷新电路即能保存它内部存储的数据。不像DRAM内存那样需要刷新电路,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积,这也是目前不能将缓存容量做得太大的重要原因。

    它的特点归纳如下:优点是节能、速度快、不必配合内存刷新电路、可提高整体的工作效率,缺点是集成度低、相同的容量体积较大、而且价格较高,只能少量用于关键性系统以提高效率。 按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是下一级缓存的一部分,这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。一般来说,每级缓存的命中率大概都在80%左右,也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、三级缓存或内存中读取,由此可见一级缓存是整个CPU缓存架构中最为重要的部分。

    一级缓存(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的一级缓存表示方法以此类推。

    Intel的采用NetBurst架构的CPU(最典型的就是PenTIum 4)的一级缓存有点特殊,使用了新增加的一种一级追踪缓存(ExecuTIon Trace Cache,T-Cache或ETC)来替代一级指令缓存,容量为12KμOps,表示能存储12K条即12000条解码后的微指令。一级追踪缓存与一级指令缓存的运行机制是不相同的,一级指令缓存只是对指令作即时的解码而并不会储存这些指令,而一级追踪缓存同样会将一些指令作解码,这些指令称为微指令(micro-ops),而这些微指令能储存在一级追踪缓存之内,无需每一次都作出解码的程序,因此一级追踪缓存能有效地增加在高工作频率下对指令的解码能力,而μOps就是micro-ops,也就是微型操作的意思。它以很高的速度将μops提供给处理器核心。Intel NetBurst微型架构使用执行跟踪缓存,将解码器从执行循环中分离出来。

    这个跟踪缓存以很高的带宽将uops提供给核心,从本质上适于充分利用软件中的指令级并行机制。Intel并没有公布一级追踪缓存的实际容量,只知道一级追踪缓存能储存12000条微指令(micro-ops)。所以,我们不能简单地用微指令的数目来比较指令缓存的大小。实际上,单核心的NetBurst架构CPU使用8Kμops的缓存已经基本上够用了,多出的4kμops可以大大提高缓存命中率。而如果要使用超线程技术的话,12KμOps就会有些不够用,这就是为什么有时候Intel处理器在使用超线程技术时会导致性能下降的重要原因。

    例如Northwood核心的一级缓存为8KB+12KμOps,就表示其一级数据缓存为8KB,一级追踪缓存为12KμOps;而Prescott核心的一级缓存为16KB+12KμOps,就表示其一级数据缓存为16KB,一级追踪缓存为12KμOps。在这里12KμOps绝对不等于12KB,单位都不同,一个是μOps,一个是Byte(字节),而且二者的运行机制完全不同。所以那些把Intel的CPU一级缓存简单相加,例如把Northwood核心说成是20KB一级缓存,把Prescott核心说成是28KB一级缓存,并且据此认为Intel处理器的一级缓存容量远远低于AMD处理器128KB的一级缓存容量的看法是完全错误的,二者不具有可比性。在架构有一定区别的CPU对比中,很多缓存已经难以找到对应的东西,即使类似名称的缓存在设计思路和功能定义上也有区别了,此时不能用简单的算术加法来进行对比;而在架构极为近似的CPU对比中,分别对比各种功能缓存大小才有一定的意义。

    转载自(http://www.elecfans.com/bandaoti/cunchu/20180814728879.html)

    展开全文
  • 、问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存...下面先看看实现级缓存(内存)、二级缓存(磁盘文件)所编写的组件
  • Hibernate 级缓存和二级缓存的区别
  • 级缓存2.1 级缓存的命中场景2.2 触发清空级缓存2.3 级缓存源码分析3 二级缓存3.1 二级缓存的设计3.2 二级缓存的使用3.3 二级缓存的命中场景3.4 二级缓存源码分析3.4.1 query查询操作。3.4.2 commit提交操作...

    1.概述

    上一篇博客《mybatis原理分析(二)—深入理解Executor》中介绍了mybatis中的一个重要的组件Executor,还有两个该组件的实现类没有介绍,那就是BaseExecutor和CachingExecutor,它们分别去处理一级缓存的逻辑和二级缓存的逻辑。这篇博客主要就是介绍这两种缓存的差别和命中场景,并且分析源码来看看mybatis是如何实现的一级缓存和二级缓存。

    1.1 BaseExecutor

    BaseExecutor是上一篇博客中介绍的三个Executor的父类,主要的功能就是维护一级缓存和对事务的管理。事务是通过会话中调用commit、rollback来管理。重点在于缓存这块是如何处理的。它提供基本的api如query和update,在query方法中处理一级缓存的逻辑,即根据sql以及参数等条件来判断缓存中是否有数据,有的话就走缓存,没有的话就会调用子类的doQuery方法来执行查询。而在update方法中,对于缓存方面的参与就是清空缓存。

    在这里插入图片描述

    1.2 CachingExecutor

    CachingExecutor,处理二级缓存的逻辑,二级缓存默认是关闭的,而一级缓存默认是打开的且必须是打开的,之后会说明为什么。

    二级缓存可以根据参数来控制开启或者关闭,它的实现是采用了装饰者的方式,在CachingExecutor中聚合了一个BaseExecutor。处理完二级缓存的逻辑后,剩余的逻辑就交给里面的Executor来实现。看下面的测试代码

    在这里插入图片描述

    将简单执行器聚合到缓存执行器中,来执行两次查询,控制台的输出内容如下:

    在这里插入图片描述

    第一次查询缓存中没有所以命中率为0.而第二次查询的时候可以看到命中率变成了0.5 说明第二次查询命中了缓存,两次查询中有一次查询命中了缓存,算出命中率为0.5

    若直接使用简单缓存执行器的结果如下:

    在这里插入图片描述

    sql预编译了两次,并且执行了两次sql查询。不会走二级缓存。

    2.一级缓存

    一级缓存也叫做会话级缓存,生命周期仅存在于当前会话,不可以直接关关闭。但可以通过flushCache和localCacheScope对其做相应控制。一级缓存默认打开。

    2.1 一级缓存的命中场景

    因为缓存中的key是由以下参数组成的,所以缓存的命中条件就是以下参数构成的key在缓存中可以找到。

    • SQL与参数相同
    • 同一个会话
    • 相同的MapperStatement ID
    • RowBounds行范围相同

    2.2 触发清空一级缓存

    1. 手动调用clearLocalCache,在BaseExecutor中有这个方法可以清空一级缓存

      在这里插入图片描述

    2. 执行提交回滚,都会去调用上面的这个清空一级缓存的方法在这里插入图片描述

    3. 执行update操作在这里插入图片描述

    4. 配置flushCache=true 在子查询的时候不会清空 清空缓存不能发生在子查询里面。在这里插入图片描述

      在query方法中有如下判断,说明当flushCache设为true的时候,并且不是子查询的时候,会清空一级缓存。queryStack表示子查询递归的层数。

      在这里插入图片描述

    5. 缓存作用域改为Statement 同理 子查询的时候不会清空

      同样在query方法中有另一个判断,如下:判断缓存的作用与是不是statement否则,就会将其清空。在这里插入图片描述

      可以在mybatis的配置文件中修改一级缓存的作用域 如下:在这里插入图片描述

    4和5的差别是 4是在查询前清空,5是在查询后清空。

    2.3 一级缓存源码分析

    如下的测试代码,debug调试

    在这里插入图片描述

    首先进来的是BaseExecutor的方法,第一行代码是动态绑定sql,这里先不考虑是如何实现的,后面会当作一个专题写一篇博客来介绍。

    第二行就是做的创建缓存key,点进去一探究进

    在这里插入图片描述

    就是将MapperStatement的id,分页参数,sql语句,传入的参数都保存在cachekey中,这也说明了为什么只有当这些条件都一样的时候,才会命中缓存。

    在这里插入图片描述

    创建好了缓存key 会去调用BaseExecutor中的另一个重载的query方法

    在这里插入图片描述

    看红色的框框,这里根据缓存key从localCache中获取对象,这个localCache也就是一级缓存。localCache是一个PerpetualCache对象,里面有一个cache Map集合。在这里插入图片描述

    缓存key作为键,查询的结果作为value。

    如果从缓存中拿到了结果 则将结果返回,如果没有则将执行queryFromDatabase去查询数据库。会将缓存key和结果集放入一级缓存中。

    在这里插入图片描述

    BaseExecutor中的query和queryFromDatabase 也是解决嵌套子查询中循环依赖问题的关键。后面会单独写一篇博客来讲这个知识点。现在我们只要关注于一级缓存是如何实现的即可。

    3 二级缓存

    二级缓存也称作是应用级缓存,与一级缓存不同的,是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改较少的数据。在流程上是先访问二级缓存,在访问一级缓存。

    3.1 二级缓存的设计

    一个应用级别的缓存,需要考虑如何存储缓存,溢出淘汰机制的设计等。

    mybatis中,使用了责任链的设计模式,将这一串的逻辑,设计成可拔插,自由组装的组件。责任链模式顾名思义就是每一个阶段处理一个阶段的责任,将责任细化,方便扩展和使用。

    涉及到的组件如下:都是一个一个套娃的形式,内部聚合了下一个组件。这样执行完这一层的逻辑可以交给下一个组件执行

    事务组件TransactionalCache->同步组件SynchronizedCache->日志组件LoggingCache->序列化组件SerializedCache->移除淘汰组件LruCache->存储策略组件PerpetualCache

    在这里插入图片描述

    从这一串默认的二级缓存的执行组件中可以看出,mybatis使用的默认的溢出淘汰机制是最近最少使用(LRU),使用的存储策略是内存存储。

    仔细看看源码里每一个组件都干了些什么

    1. 调试源码,可以发现上面这一串的逻辑是在执行了commit的时候进行的。commit处打个断点。在这里插入图片描述

    2. CachingExecutor

      由CachingExecutor内部聚合的Executor去执行会话提交,然后提交事务缓存管理器的暂存区,进行更新二级缓存的操作。

      在这里插入图片描述

    3. TransactionalCacheManager

      管理二级缓存空间和对应的暂存区的关系,一一对应。有多少个二级缓存空间,每个线程内就有多少个暂存区。

      遍历暂存区,执行事务组件的commit方法在这里插入图片描述

    4. TransactionalCache

      判断是否设置了提交后清空。然后执行flushPendingEntries,遍历缓存在事务缓存管理器的暂存区里的对象。一个一个的执行下一个组件的putObject方法,也就是将暂存区里的键值对都更新到二级缓存空间中。
      在这里插入图片描述
      在这里插入图片描述

    5. SynchronizedCache

      这个组件只做一件事情,为每个方法做同步处理,加上了synchronized。因为二级缓存是线程共享的,所以需要做同步处理

      在这里插入图片描述

    6. LoggingCache

      这是日志组件,仅对getObject方法做了修改,打印出日志,计算输出二级缓存的命中率
      在这里插入图片描述

    7. SerializedCache

      序列化组件,put的时候将查询结果进行序列化,get的时候进行反序列化。因为二级缓存是跨线程使用的。若保存在缓存中的对象不进行序列化的话,之后多个线程拿到的对象是同一个对象 这样会有线程安全的问题。
      在这里插入图片描述

    8. LruCache

      溢出淘汰机制组件,默认是最近最少使用的淘汰掉。

      在这里插入图片描述
      在这里插入图片描述

    9. PerpetualCache

      存储策略组件,采用内存存储。

      在这里插入图片描述

    3.2 二级缓存的使用

    二级缓存默认是不开启的,需要为其声明缓存空间才可以使用,通过在mapper上设置注解

    在这里插入图片描述

    或者在mybatis的配置文件中,设置打开二级缓存的支持

    在这里插入图片描述

    然后在mapper中设置

    < cache/> 表示开启这个mapper的二级缓存空间

    值得注意的是,如果UserMapper中加了二级缓存的注解 并且UserMapper.xml中同时设置了< cache/> 将会报错。需要将其中之一改成二级缓存的空间引用。例如在xml中将< cache/> 改成 指向注解声明的缓存空间。

    在这里插入图片描述

    @CacheNamespace 注解详细的配置信息见下图,说明可以对这个二级缓存做自定义。实现自定义的相关实现类。例如自定义的存储实现类,自定义的缓存溢出淘汰机制。默认是最近最少使用。

    在这里插入图片描述

    3.3 二级缓存的命中场景

    1. 相同sql和参数
    2. 相同的statement的id
    3. RowBounds行范围相同
    4. 会话提交之后

    3.4 二级缓存源码分析

    3.4.1 query查询操作。
    1. 首先执行的CachingExecutor的query方法,获取动态绑定sql,创建缓存key然后执行另一个重载的query方法,缓存key和一级缓存中的一样。
      在这里插入图片描述

    2. 这里做的事情就比较多了。从statement中得到二级缓存空间。判断二级缓存空间是否存在,也就是有没有开启二级缓存的支持。如果有,则进入第一个if。没有的话就交给里面BaseExecutor执行它的query逻辑。
      在这里插入图片描述

    3. flushCacheIfRequired(ms) 检查是否设置了清空二级缓存的参数,如果是true,则执行清空二级缓存。默认的查询相关的statement中的flushCacheRequired属性是false,可以通过手动的将其设置为true,那么在执行查询的时候也会清空二级缓存。

    4. ensureNoOutParams 如果是callcabelStatement 不支持对出参的缓存。抛出异常

    5. tcm.getObject 从二级缓存中找是否存在缓存key对应的结果。如果此时还没有创建二级缓存空间对应的暂存区,则执行创建。事务缓存管理器里面维护了一个暂存区Map。二级缓存空间作为key,暂存区作为value。一一对应。并且将这个key,记录下来,表明它没有命中。

      TransactionalCache 中的 private final Set entriesMissedInCache;就是用来记录没有命中的缓存key

      在这里插入图片描述

    6. 如果此时二级缓存中没有,则执行查询操作。

    7. 将结果集,放入到事务缓存管理器的暂存区中。

      在这里插入图片描述

      在这里插入图片描述

      TransactionalCache 中的 private final Map<Object, Object> entriesToAddOnCommit //暂存区,key是之前创建出来的缓存key,value是对应的查询结果。

    3.4.2 commit提交操作。
    1. 首先来到CachingExecutor 中的comit方法 主要做两件事情,一是将会话提交,清空一级缓存。二是提交事务缓存管理器中的所有暂存区,进行更新二级缓存的操作。
      在这里插入图片描述

    2. TransactionalCacheManager 中的commit

      会话提交这里不考虑,看看事务缓存管理器中的commit方法

      遍历暂存区,对每一个暂存区执行提交操作。

      在这里插入图片描述

    3. TransactionalCache 中的commit

      执行flushPendingEntries 和 reset

      在这里插入图片描述

    4. flushPendingEntries

      遍历暂存区所有的键值对,全部放到二级缓存空间中。然后遍历之前存放的没有命中二级缓存中的缓存key。如果这个键在暂存区没有出现过。则将这个键和null值提交给二级缓存空间。这样做的目的是为了避免无效的查询,多次的去查询数据库,而造成数据库很大的压力负担。也就是解决缓存穿透的问题。
      在这里插入图片描述

    3.4.3 update操作
    1. 首先来到的是CachingExecutor中的update方法,做两件事情,清空暂存区并设置提交清空标记为true。交给baseExecutor执行它的update逻辑。在这里插入图片描述

    2. 检查清空缓存标记是否为true,对于update相关的statement中的flushCacheRequired属性默认是true,所以对于update操作必然会清空二级缓存。而Select相关的statement中的flushCacheRequired属性默认是false。如果将这个属性手动的设置为true,则也会执行清空二级缓存的操作。让我们看看缓存事务管理器中的clear是做了哪些事情

      在这里插入图片描述

    3. 根据二级缓存空间拿到对应的暂存区,执行clear

      在这里插入图片描述

    4. 设置提交时清空标记为true,然后清空暂存区。可以看到此时并没有真正的对二级缓存空间进行清空,而仅仅是设置了提交时清空标记,等到执行commit的时候,才会清空二级缓存空间。

      在这里插入图片描述

    3.5 为什么只有会话提交成功才会更新或清空二级缓存

    假设现在数据库中有一行数据,name=gongsenlin,age=18

    此时第一个线程,执行了update操作,将age更新成了16,并且执行了select方法,若不是按照mybatis的设计思路提交后才更新二级缓存,而是直接在查询后就更新二级缓存。

    那么此时第二个线程执行select方法,会看到二级缓存中有数据,则直接从二级缓存中获取,会查询到name=gongsenlin,age=16。

    但是此时第一个线程突然出现了错误,回滚了,之前的更新操作失效了。那么此时数据库中的数据又回到了name=gongsenlin,age=18。

    但是第二个线程却读到了age=16,造成了脏读。所以mybatis是为了避免多线程脏读的出现,才设计成提交后更新或清空二级缓存。

    4. 后续

    下一篇博客介绍mybatis中的Jdbc处理器—StatementHandler。

    展开全文
  • 级缓存、二级缓存三级缓存

    千次阅读 2019-10-02 18:39:59
    大家都知道CPU缓存很重要,但对于缓存的具体细分却知之甚少,本文只要是关于CPU缓存的介绍,并着重描述了级缓存、二级缓存三级缓存区别方法。 CPU缓存 CPU缓存(Cache Memory)是位于CPU与内存之间的临时...
    缓冲/存储技术
    +关注

    大家都知道CPU缓存很重要,但对于缓存的具体细分却知之甚少,本文只要是关于CPU缓存的介绍,并着重描述了一级缓存、二级缓存、三级缓存区别方法。

    CPU缓存

    CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先缓存中调用,从而加快读取速度。

    一级缓存、二级缓存、三级缓存区别是什么 详解它们的区分方法

    CPU缓存的容量比内存小的多但是交换速度却比内存要快得多。缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。  

    缓存大小是CPU的重要指标之一,而且缓存的结构和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存或者硬盘上寻找,以此提高系统性能。但是从CPU芯片面积和成本的因素来考虑,缓存都很小。

    按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是下一级缓存的一部分,这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。一般来说,每级缓存的命中率大概都在80%左右,也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、三级缓存或内存中读取,由此可见一级缓存是整个CPU缓存架构中最为重要的部分。

    一级缓存、二级缓存、三级缓存区别是什么

      一级缓存、二级缓存、三级缓存是什么?作用?区别? 首先简单了解一下一级缓存。目前所有主流处理器大都具有一级缓存和二级缓存,少数高端处理器还集成了三级缓存。其中,一级缓存可分为一级指令缓存和一级数据缓存。一级指令缓存用于暂时存储并向CPU递送各类运算指令;一级数据缓存用于暂时存储并向CPU递送运算所需数据,这就是一级缓存的作用。 那么,二级缓存的作用又是什么呢?简单地说,二级缓存就是一级缓存的缓冲器:一级缓存制造成本很高因此它的容量有限,二级缓存的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。同样道理,三级缓存和内存可以看作是二级缓存的缓冲器,它们的容量递增,但单位制造成本却递减。

      需要注意的是,无论是二级缓存、三级缓存还是内存都不能存储处理器操作的原始指令,这些指令只能存储在CPU的一级指令缓存中,而余下的二级缓存、三级缓存和内存仅用于存储CPU所需数据。 根据工作原理的不同,目前主流处理器所采用的一级数据缓存又可以分为实数据读写缓存和数据代码指令追踪缓存2种,它们分别被AMD和Intel所采用。不同的一级数据缓存设计对于二级缓存容量的需求也各不相同,下面让我们简单了解一下这两种一级数据缓存设计的不同之处。

      一、AMD一级数据缓存设计 AMD采用的一级缓存设计属于传统的“实数据读写缓存”设计。基于该架构的一级数据缓存主要用于存储CPU最先读取的数据;而更多的读取数据则分别存储在二级缓存和系统内存当中。做个简单的假设,假如处理器需要读取“AMD ATHLON 64 3000+ IS GOOD”这一串数据(不记空格),那么首先要被读取的“AMDATHL”将被存储在一级数据缓存中,而余下的“ON643000+ISGOOD”则被分别存储在二级缓存和系统内存当中(如下图所示)。 需要注意的是,以上假设只是对AMD处理器一级数据缓存的一个抽象描述,一级数据缓存和二级缓存所能存储的数据长度完全由缓存容量的大小决定,而绝非以上假设中的几个字节。“实数据读写缓存”的优点是数据读取直接快速,但这也需要一级数据缓存具有一定的容量,增加了处理器的制造难度(一级数据缓存的单位制造成本较二级缓存高)。

      二、Intel一级数据缓存设计 自P4时代开始,Intel开始采用全新的“数据代码指令追踪缓存”设计。基于这种架构的一级数据缓存不再存储实际的数据,而是存储这些数据在二级缓存中的指令代码(即数据在二级缓存中存储的起始地址)。假设处理器需要读取“INTEL P4 IS GOOD”这一串数据(不记空格),那么所有数据将被存储在二级缓存中,而一级数据代码指令追踪缓存需要存储的仅仅是上述数据的起始地址。

      由于一级数据缓存不再存储实际数据,因此“数据代码指令追踪缓存”设计能够极大地降CPU对一级数据缓存容量的要求,降低处理器的生产难度。但这种设计的弊端在于数据读取效率较“实数据读写缓存设计”低,而且对二级缓存容量的依赖性非常大。 在了解了一级缓存、二级缓存的大致作用及其分类以后,下面我们来回答以下硬件一菜鸟网友提出的问题。

      从理论上讲,二级缓存越大处理器的性能越好,但这并不是说二级缓存容量加倍就能够处理器带来成倍的性能增长。目前CPU处理的绝大部分数据的大小都在0-256KB之间,小部分数据的大小在256KB-512KB之间,只有极少数数据的大小超过512KB。所以只要处理器可用的一级、二级缓存容量达到256KB以上,那就能够应付正常的应用;512KB容量的二级缓存已经足够满足绝大多数应用的需求。 这其中,对于采用“实数据读写缓存”设计的AMD Athlon 64、Sempron处理器而言,由于它们已经具备了64KB一级指令缓存和64KB一级数据缓存,只要处理器的二级缓存容量大于等于128KB就能够存储足够的数据和指令,因此它们对二级缓存的依赖性并不大。这就是为什么主频同为1.8GHz的Socket 754 Sempron 3000+(128KB二级缓存)、Sempron 3100+(256KB二级缓存)以及Athlon 64 2800+(512KB二级缓存)在大多数评测中性能非常接近的主要原因。所以对于普通用户而言754 Sempron 2600+是值得考虑的。 反观Intel目前主推的P4、赛扬系列处理器,它们都采用了“数据代码指令追踪缓存”架构,其中Prescott内核的一级缓存中只包含了12KB一级指令缓存和16KB一级数据缓存,而Northwood内核更是只有12KB一级指令缓存和8KB一级数据缓存。

      因此,P4、赛隆系列处理器非常依赖于二级缓存,赛扬D 320(256KB二级缓存)和赛扬2.4GHz(128kb二级缓存)的性能差距是很好的证明;Cayon D和P4E处理器之间的性能差距也非常明显。最后,如果你是一个狂热的游戏爱好者或者一个专业的多媒体用户,一个带有1MB二级缓存的P4处理器和一个512Kb/1MB二级缓存的Athon 64处理器是你的理想选择。由于CPU的主存和二级缓存在重计算负载下几乎是“满”的,大的二级缓存可以为处理器提供大约5%到10%的性能改进,这对于要求苛刻的用户是绝对必要的。一级缓存是在CPU内的,用来存放内部指令,2级缓存和CPU封装在一起,也是用来存放指令数据的,三级和四级缓存只在高端的服务器CPU里有,作用差不多,速度更快,更稳定,更有效 并不是缓存越大越好,譬如AMD和INTER就有不同的理论,AMD认为一级缓存越大越好,所以一级比较大,而INTER认为过大会有更长的指令执行时间,所以一级很小,二级缓存那两个公司的理论又反过来了,AMD的小,INTER的大,一般主流的INTERCPU的2级缓存都在2M左右 我们通常用(L1,L2)来称呼缓存又叫高速缓冲存储器其作用在于缓解主存速度慢、跟不上CPU读写速度要求的矛盾。它的实现原理,是把CPU最近最可能用到的少量信息(数据或指令)从主存复制到CACHE中,当CPU下次再用这些信息时,它就不必访问慢速的主存,而直接从快速的CACHE中得到,从而提高了得到这些信息的速度,使CPU有更高的运行效率。

      缓存的大小

      一般说来,更大一点的cache容量,对提高命中率是有好处的,如图4.20所示,由于cache 是用价格很高的静态存储器SRAM器件实现的,而cache容量达到一定大小这后,再增加其容量,对命中率的提高并不明显,从合理的性能/价格比考虑,cache的容量设置应在一个合理的容量范围之内。缓存要分一级二级 三级,是为了建立一个层次存储结构,以达到最高性价比。而且多级组织还可以提高cache的命中率,提高执行效能。

      CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。由此可见,在CPU中加入缓存是一种高效的解决方案,这样整个内存储器(缓存+内存)就变成了既有缓存的高速度,又有内存的大容量的存储系统了。缓存对CPU的性能影响很大,主要是因为CPU的数据交换顺序和CPU与缓存间的带宽引起的。 缓存的工作原理是当CPU要读取一个数据时,首先从缓存中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。 正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在缓存中,只有大约10%需要从内存读取。

      这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先缓存后内存。 目前缓存基本上都是采用SRAM存储器,SRAM是英文Static RAM的缩写,它是一种具有静志存取功能的存储器,不需要刷新电路即能保存它内部存储的数据。不像DRAM内存那样需要刷新电路,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积,这也是目前不能将缓存容量做得太大的重要原因。

      它的特点归纳如下:优点是节能、速度快、不必配合内存刷新电路、可提高整体的工作效率,缺点是集成度低、相同的容量体积较大、而且价格较高,只能少量用于关键性系统以提高效率。 按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是下一级缓存的一部分,这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。一般来说,每级缓存的命中率大概都在80%左右,也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、三级缓存或内存中读取,由此可见一级缓存是整个CPU缓存架构中最为重要的部分。 

      一级缓存(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的一级缓存表示方法以此类推。

       Intel的采用NetBurst架构的CPU(最典型的就是Pentium 4)的一级缓存有点特殊,使用了新增加的一种一级追踪缓存(Execution Trace Cache,T-Cache或ETC)来替代一级指令缓存,容量为12KμOps,表示能存储12K条即12000条解码后的微指令。一级追踪缓存与一级指令缓存的运行机制是不相同的,一级指令缓存只是对指令作即时的解码而并不会储存这些指令,而一级追踪缓存同样会将一些指令作解码,这些指令称为微指令(micro-ops),而这些微指令能储存在一级追踪缓存之内,无需每一次都作出解码的程序,因此一级追踪缓存能有效地增加在高工作频率下对指令的解码能力,而μOps就是micro-ops,也就是微型操作的意思。它以很高的速度将μops提供给处理器核心。Intel NetBurst微型架构使用执行跟踪缓存,将解码器从执行循环中分离出来。

      这个跟踪缓存以很高的带宽将uops提供给核心,从本质上适于充分利用软件中的指令级并行机制。Intel并没有公布一级追踪缓存的实际容量,只知道一级追踪缓存能储存12000条微指令(micro-ops)。所以,我们不能简单地用微指令的数目来比较指令缓存的大小。实际上,单核心的NetBurst架构CPU使用8Kμops的缓存已经基本上够用了,多出的4kμops可以大大提高缓存命中率。而如果要使用超线程技术的话,12KμOps就会有些不够用,这就是为什么有时候Intel处理器在使用超线程技术时会导致性能下降的重要原因。

       例如Northwood核心的一级缓存为8KB+12KμOps,就表示其一级数据缓存为8KB,一级追踪缓存为12KμOps;而Prescott核心的一级缓存为16KB+12KμOps,就表示其一级数据缓存为16KB,一级追踪缓存为12KμOps。在这里12KμOps绝对不等于12KB,单位都不同,一个是μOps,一个是Byte(字节),而且二者的运行机制完全不同。所以那些把Intel的CPU一级缓存简单相加,例如把Northwood核心说成是20KB一级缓存,把Prescott核心说成是28KB一级缓存,并且据此认为Intel处理器的一级缓存容量远远低于AMD处理器128KB的一级缓存容量的看法是完全错误的,二者不具有可比性。在架构有一定区别的CPU对比中,很多缓存已经难以找到对应的东西,即使类似名称的缓存在设计思路和功能定义上也有区别了,此时不能用简单的算术加法来进行对比;而在架构极为近似的CPU对比中,分别对比各种功能缓存大小才有一定的意义。

    结语 

    关于缓存的细分就介绍到这了,希望本文能对你有所帮助。

    转载于:https://www.cnblogs.com/yzl050819/p/11335652.html

    展开全文
  • Mybatis的级缓存和二级缓存详解

    千次阅读 多人点赞 2018-11-19 19:11:59
    注:本笔记是根据尚硅谷的MyBatis视频记录的 对于任何个持久层框架,都有缓存机制;缓存在电脑中有块真实的存储空间...关于Mybatis的级缓存和二级缓存执行顺序具体可参考:Mybatis的级缓存和二级缓存执行...
  • MyBatis级缓存和二级缓存

    万次阅读 多人点赞 2018-09-05 22:44:30
    MyBatis自带的缓存有级缓存和二级缓存 级缓存 Mybatis的级缓存是指Session缓存。级缓存的作用域默认是个SqlSession。Mybatis默认开启级缓存。 也就是在同个SqlSession中,执行相同的查询SQL,第次...
  • title: CPU Cache date: 2019-11-17 20:20:30 keywords: cache “CPU .... CPU 与 Memory 内存之间的三级缓存的实现原理 1.1 cache 存在的原理   引入 Cache 的理论基础是程序局部性原理,包括时间局部性和...
  • MyBatis实战(5)缓存机制(级缓存、二级缓存

    千次阅读 多人点赞 2019-11-30 09:49:01
    这篇博客对Mybatis中的级缓存和二级缓存做了比较详细的阐述,并有完整的代码实现。
  • Mybatis级缓存与二级缓存

    千次阅读 2019-01-01 15:31:16
    mybatis的有两种缓存,级缓存和二级缓存。两个缓存的不同点和相同点总结如下 不同点: 级缓存存在于一个SqlSession之内,二级缓存存在于不同的SqlSession之间 级缓存不需要手动开启,属于默认开启状态;...
  • 缓存:将相同查询条件的sql语句执行遍后所得到的结果存在内存或者某种缓存介质当中,当下次遇到一模一样的查询sql时候不在执行sql与数据库交互,而是直接从缓存中获取结果,减少服务器的压力; myb...
  • Mybatis级缓存(默认开启) 是SqlSession级别的缓存, 默认开启 Mybatis二级缓存(默认关闭,一般不建议使用) namspace/mapper级别(跨sqlSession)的缓存, 默认关闭
  • 题记 常常听到别人提起:“级缓存、二级缓存三级缓存”。那么它们是什么呢?有什么作用呢?
  • 篇:21-Mybatis二级缓存... 关闭二级缓存级缓存可正常使用 2. <select useCache="false"> 关闭二级缓存级缓存可正常使用 3. <select flushCache="true"> :二级均被清空
  • Hibernate缓存策略(级缓存、二级缓存

    万次阅读 多人点赞 2018-05-16 16:38:52
    Hibernate是个持久化框架,经常需要... 缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,它位于数据库与数据库访问中间层,ORM在查询数据时,首先会根据自身的缓存管理策略,在缓存中...
  • SpringBoot集成Mybatis几乎已经成为大多数项目的标配了,但在使用的过程中Mybatis的缓存功能往往会被大家遗忘,甚至很多开发者都没意识到在SpringBoot集成Mybatis还有级缓存和二级缓存的事。 本来没计划写本篇文章...
  • Mybatis中有级缓存和二级缓存,默认情况下级缓存是开启的,而且是不能关闭的。级缓存是指SqlSession级别的缓存,当在同个SqlSession中进行相同的SQL语句查询时,第二次以后的查询不会从数据库查询,而是直接...
  • 【CPU缓存】二级三级缓存

    千次阅读 2019-10-16 16:09:46
    CPU缓存   CPU缓存(Cache Memory)是位于 CPU 与内存之间的临时存储器,它的容量比内存小的多,但是交换速度却快得多...在缓存中的数据是内存中的小部分,但这小部分是短时间内CPU即将访问的(?如何判断),...
  • 用以介绍hibernate 框架的缓存机制
  • 要想回答这个问题,必须把级缓存和二级缓存的实现搞明白,详细介绍一下 我们知道Mybatis有级缓存和二级缓存,底层都是用HashMap实现的 key为CacheKey对象(后续说原因),value为从数据库中查出来的值。 Mybatis...
  • 1、缓存 (1)概念:在内存中开辟的个区域,用于存放数据,在内存中存放的数据叫做缓存。 (2)好处:内存读取速度远快于硬盘,合理利用缓存,可以极大的提高查询的效率。...1.2 二级缓存 1、概念 (1)什...
  • Hibernate级缓存和二级缓存详解

    万次阅读 多人点赞 2014-10-14 09:02:38
    缓存二级缓存的概念解释 (1)级缓存就是Session级别的缓存,个Session做了个查询操作,它会把这个操作的结果放在级缓存中,如果短时间内这个 session(一定要同个session)又做了同个操作,...
  • 前两天总结了一下二级缓存和查询缓存的关系,但是又有个新的问题,就是查询缓存缓存到二级缓存的数据,在第次(第次缓存中没有数据,查询数据库将对应的ID值存入到二级缓存中去,第二次如果是同个Session...
  • mybaits提供级缓存,和二级缓存级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据...
  • mybatis二级缓存 + reads做第三级缓存
  • Mybatis的一级缓存是指SqlSession级别的,作用域是SqlSession,Mybatis默认开启一级缓存,在同个SqlSession中,相同的Sql查询的时候,第次查询的时候,就会从缓存中取,如果发现没有数据,那么就从数据库查询...
  • 文章目录MyBatis缓存机制Spring+MyBatis开启二级缓存1. 创建MyBatis核心配置文件,在settings中开启二级缓存2. 在spring的核心配置文件中,sqlSessionFactory的bean中,将mybatis的配置粘入3. 在mapper.xml映射文件...
  • Mybatis的级缓存是默认开启的,它只相对于同个SqlSession有效,所以也称之为SqlSession缓存。...Mybatis的二级缓存是默认未开启的,如果希望开启,需要在配置SQL的XML文件中配置<cache>节点,由于每

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 361,621
精华内容 144,648
关键字:

内存一级缓存二级缓存三级缓存