一级缓存和二级缓存的理解

首先补充下CPU的知识:

  1. CPU也就是中央处理器,相当于计算机的大脑;

  2. CPU是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit);

  3. CPU功能主要是解释计算机指令以及处理计算机软件中的数据;

  4. 中央处理器主要包括运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus);

  5. CPU与内部存储器(Memory)和输入/输出(I/O)设备合称为电子计算机三大核心部件。

什么是缓存和内存:

什么是内存?

内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。 内存是由内存芯片、电路板、金手指等部分组成的。

什么是缓存?

缓存是CPU的一部分,它存在于CPU中,CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大。缓存是为了解决CPU速度和内存速度的速度差异问题。内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多。

这里要特别指出的是: 因为缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速度就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。 因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,现在又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的。 

关于一级缓存和二级缓存 

为了分清这两个概念,内存有RAM和ROM两种,我们先了解一下RAM(随机存储器) 和ROM(只读存储器).

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找数据或指令的顺序是:先到一级缓存中找,找不到再到二级缓存中找,如果还找不到就只有到内存中找了

 

处理器缓存的传输速率确实很高,然而还不足以取代内存的地位,这主要是由于缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据。与此同时系统的速度就慢了下来,不过CPU会把这些数据复制到缓存中去,以便下一次不用再到内存中去取。就目前缓存容量、成本以及功耗表现来看,还远远无法与内存抗衡,另外从某种意义上来说,内存也是处理器缓存的一种表现形式,只不过在速率上慢很多,然而却在容量、功耗以及成本方面拥有巨大优势。如果内存在将来可以做到足够强的话,反而很有取代处理器缓存的可能。

  错误观点二:处理器缓存是一个整体


【图】生产技术对缓存容量大小的影响


【图】PCB上带缓存的PentiumIII处理器

  事实上最早先的CPU缓存确实是个整体,而且容量也很低。英特尔公司从Pentium时代开始后就把缓存进行了分类,当时集成在CPU内核中的缓存已不足以满足CPU的需求,而制造工艺上的限制又不能大幅度提高缓存的容量。因此出现了集成在与CPU同一块电路板上或主板上的缓存,此时就把CPU内核集成的缓存称为一级缓存,而外部的称为二级缓存;后来随着生产技术的不断提高,最终二级缓存也被挪进了处理器当中。通常一级缓存中还分数据缓存(Data Cache,D-Cache)和指令缓存(Instruction Cache,I-Cache)。二者分别用来存放数据和执行这些数据的指令,而且两者可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。英特尔公司在推出Pentium 4处理器时,还新增了一种一级追踪缓存,容量为12KB。

  错误观点三:L1级缓存和L2级缓存只有容量上的差别

  用于存储数据的缓存部分通常被称为RAM,掉电以后其中的信息就会消失。RAM又分两种,其中一种是静态RAM(SRAM);另外一种是动态 RAM(DRAM)。前者的存储速度要比后者快得多,我们现在使用的内存一般都是动态RAM。处理器的L1级缓存通常都是静态RAM,速度非常的快,但是静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍),而且价格也相对较为昂贵(同容量的静态RAM是动态RAM的四倍)。扩大静态RAM作为缓存是一个不太合算的做法,但是为了提高系统的性能和速度又必须要扩大缓存,这就有了一个折中的方法:在不扩大原来的静态RAM缓存容量的情况下,仅仅增加一些高速动态RAM做为L2级缓存。高速动态RAM速度要比常规动态RAM快,但比原来的静态RAM缓存慢,而且成本也较为适中。一级缓存和二级缓存中的内容都是内存中访问频率高的数据的复制品(映射),它们的存在都是为了减少高速CPU对慢速内存的访问。

 

 

  二级缓存是CPU性能表现的关键之一,在CPU核心不变化的情况下,增加二级缓存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二级缓存上存在差异,由此可见二级缓存对CPU的重要性。CPU在缓存中找到有用的数据被称为命中,当缓存中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。从理论上讲,在一颗拥有二级缓存的CPU中,读取一级缓存的命中率为80%。也就是说CPU一级缓存中找到的有用数据占数据总量的80%,剩下的20%从二级缓存中读取。由于不能准确预测将要执行的数据,读取二级缓存的命中率也在80%左右(从二级缓存读到有用的数据占总数据的 16%)。那么还有的数据就不得不从内存调用,但这已经是一个相当小的比例了。目前的较高端CPU中,还会带有三级缓存,它是为读取二级缓存后未命中的数据设计的—种缓存,在拥有三级缓存的CPU中,只有约5%的数据需要从内存中调用,这进一步提高了CPU的效率,从某种意义上说,预取效率的提高,大大降低了生产成本却提供了非常接近理想状态的性能。除非某天生产技术变得非常强,否则内存仍会存在,缓存的性能递增特性也仍会保留。

  错误观点四:缓存只是随意调取数据并无选择

  即便处理器内部集成的缓存数据交换能力非常强,也仍需要对调取数据做一定的筛选。这是因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,现在又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据经常是被访问最频繁的。命中率算法中较常用的“最近最少使用算法”(LRU算法),它是将最近一段时间内最少被访问过的行淘汰出局。因此需要为每行设置一个计数器,LRU算法是把命中行的计数器清零,其他各行计数器加1。当需要替换时淘汰行计数器计数值最大的数据行出局。这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出缓存,提高缓存的利用率。



【图】拥有144MB缓存的八路IBM POWER5处理器

  总结:

高速缓存做为处理器不可分割的一部分,已经融入到性能提升的考虑因素当中,伴随生产技术的进一步发展,缓存的级数还将增加,容量也会进一步提高。作为处理器性能助推器的高速缓存,仍会在成本和功耗控制发挥巨大的优势,而性能方面也会有长足的发展。可以毫不夸张的说:缓存技术带领处理器走进了多彩的天堂。

 

 

一级缓存二级缓存分布缓存页面缓存的主要区别

 

 

1.一级缓存属于 局部缓存 (操作时命中率低)


存放数据的形式:相互关联的持久化对象

缓存的范围:事务范围,每个事务都拥有单独的一级缓存

并发访问策略:由于每个事务都拥有单独的一级缓存不会出现并发问题,因此无须提供并发访问策略

数据过期策略:处于一级缓存中的对象永远不会过期,除非应用程序显示清空或者清空特定对象

物理介质:内存

缓存软件实现:在Hibernate的Session的实现中包含

启用缓存的方式:只要通过Session接口来执行保存,更新,删除,加载,查询,Hibernate就会启用一级缓存,对于批量操作,如不希望启用一级缓存,直接通过JDBCAPI来执行

管理缓存的方式:一级缓存的物理介质为内存,由于内存的容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目,Session的evit(Object
 obj)方法可以显示的清空缓存中特定对象,clear():清空缓存中所有持久化对象。


2.二级缓存属于 全局缓存(操作时命中率高)

存放数据的形式:对象的散装数据

缓存的范围:进程范围或集群范围,缓存被同一个进程或集群范围内所有事务共享

并发访问策略:由于多个事务会同时访问二级缓存中的相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别

数据过期策略:必须提供数据过期策略,如基于内存的缓存中对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间

物理介质:内存和硬盘,对象的散装数据首先存放到基于内存的缓存中,当内存中对象的数目达到数据过期策略的maxElementsInMemory值,就会把其余的对象写入基于硬盘的缓存中

缓存软件实现:由第三方提供,Hibernate仅提供了缓存适配器,用于把特定的缓存插件集成到Hibernate中

启用缓存的方式:用户可以再单个类或类的单个集合的粒度上配置第二级缓存,如果类的实例被经常读,但很少被修改,就可以考虑使用二级缓存,只有为某个类或集合配置了二级缓存,Hibernate在运行时才会把它的实例加入到二级缓存中

管理缓存的方式:二 级缓存的物理介质可以使内存和硬盘,因此第二级缓存可以存放大容量的数据,数据过期策略的maxElementsInMemory属性可以控制内存中的对
 象数目,管理二级缓存主要包括两个方面:选择需要使用第二级缓存的持久化类,设置合适的并发访问策略;选择缓存适配器,设置合适的数据过期策略。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象。

 

(1)什么样的数据适合存放到第二级缓存中?

      很少被修改的数据

     不是很重要的数据,允许出现偶尔并发的数据

      不会被并发访问的数据

      参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

(2)常用的缓存插件 Hibernater二级缓存插件如下

EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。

      OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。

      SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。   

      JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。

      memcached:是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度

     redis:是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)
3.分布式缓存 (内存占用小,抗压强) 可用于所有层

3.1分布式缓存具有如下特性:

高性能:当传统数据库面临大规模数据访问时,磁盘I/O 往往成为性能瓶颈,从而导致过高的响应延迟.分布式缓存将高速内存作为数据对象的存储介质,数据以key/value 形式存储,理想情况下可以获得DRAM 级的读写性能;

动态扩展性:支持弹性扩展,通过动态增加或减少节点应对变化的数据访问负载,提供可预测的性能与扩展性;同时,最大限度地提高资源利用率;

高可用性:可用性包含数据可用性与服务可用性两方面.基于冗余机制实现高可用性,无单点失效(single point of failure),支持故障的自动发现,透明地实施故障切换,不会因服务器故障而导致缓存服务中断或数据丢失.动态扩展时自动均衡数据分区,同时保障缓存 服务持续可用;

易用性:提供单一的数据与管理视图;API 接口简单,且与拓扑结构无关;动态扩展或失效恢复时无需人工配置;自动选取备份节点;多数缓存系统提供了图形化的管理控制台,便于统一维护;

分布式代码执行(distributed code execution):将任务代码转移到各数据节点并行执行,客户端聚合返回结果,从而有效避免了缓存数据的移动与传输.最新的Java 数据网格规范JSR-347中加入了分布式代码执行与Map/reduce 的API 支持,各主流分布式缓存产品,如IBM WebSphere eXtreme Scale,VMware
 GemFire,GigaSpaces XAP 和Red Hat Infinispan 等也都支持这一新的编程模型.

 

3.2分布式缓存的典型应用场景可分为以下几类:

页面缓存.用来缓存Web 页面的内容片段,包括HTML、CSS 和图片等,多应用于社交网站等;

应用对象缓存.缓存系统作为ORM 框架的二级缓存对外提供服务,目的是减轻数据库的负载压力,加速应用访问;

状态缓存.缓存包括Session 会话状态及应用横向扩展时的状态数据等,这类数据一般是难以恢复的,对可用性要求较高,多应用于高可用集群;

并行处理.通常涉及大量中间计算结果需要共享;

事件处理.分布式缓存提供了针对事件流的连续查询(continuous query)处理技术,满足实时性需求;

极限事务处理.分布式缓存为事务型应用提供高吞吐率、低延时的解决方案,支持高并发事务请求处理,多应用于铁路、金融服务和电信等领域.

 

3.3高性能的分布式缓存框架

Ehcache – Java分布式缓存框架

Cacheonix – 高性能Java分布式缓存系统

ASimpleCache – 轻量级Android缓存框架

JBoss Cache – 基于事物的Java缓存框架

Voldemort – 基于键-值(key-value)的缓存框架
4.页面缓存(Oscached)

类似于Map 因为存储格式是K,V形式的

K :url

V:页面 (html,jsp)

在用户第一次访问网站时因为缓存中没有,因此会去请求并加载,反馈给用户前会存在缓存中,自动拼接成静态页面,并在用户下一次访问时快速从缓存中取到给用户。防止用户频繁刷新影响服务器性能。

优点:性能最好

缺点:数据可能不同步 解决: 设置时间去同步数据库

 

OSCache由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能

特点

(1)缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。

(2)拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。

(3)永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。

(4)支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。

(5)缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)
 

 

 

 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 关于MyBatis的一级缓存二级缓存,它们都是用来优化数据库访问性能的。一级缓存是在同一个 SqlSession 中进行缓存,可以避免重复查询同一个对象的数据,提高查询性能。二级缓存是在不同 SqlSession 之间共享的缓存,可以避免重复查询同一个表的数据,提高查询性能。但需要注意的是,二级缓存要保证缓存数据的一致性,需要使用配置文件中的缓存刷新策略进行设置。 ### 回答2: Mybatis是一种开源的持久层框架,用于将数据库操作映射到Java对象。在面试中如何回答Mybatis的一级缓存二级缓存问题呢? 一级缓存是指Mybatis在执行数据库查询的过程中,将查询结果缓存在SqlSession对象中。当多次执行相同的查询时,Mybatis会首先检查一级缓存中是否存在该查询的结果,如果存在则直接返回缓存的结果,而不再去查询数据库。一级缓存的作用范围仅限于同一个SqlSession对象,当SqlSession对象关闭或执行更新、插入、删除等操作时,一级缓存会失效。 二级缓存是指Mybatis在执行数据库查询的过程中,将查询结果缓存在SessionFactory对象中。这意味着多个SqlSession对象可以共享同一个二级缓存。当多个SqlSession对象执行相同的查询时,首先会检查二级缓存中是否存在该查询的结果,如果存在则直接返回缓存的结果。二级缓存的作用范围跨越多个SqlSession对象,当整个应用程序关闭时,二级缓存会失效。 在回答这个问题时,可以从以下几个方面展开: 1. 对于一级缓存: - 首先简要介绍一级缓存的概念和特点; - 强调一级缓存的有效范围仅限于同一个SqlSession对象; - 提到当SqlSession对象关闭或执行更新操作时,一级缓存会失效。 2. 对于二级缓存: - 首先简要介绍二级缓存的概念和特点; - 强调多个SqlSession对象可以共享同一个二级缓存; - 提到当整个应用程序关闭时,二级缓存会失效。 3. 对比一级缓存二级缓存: - 强调一级缓存的作用范围较小,而二级缓存的作用范围跨越多个SqlSession对象; - 提到一级缓存是默认开启的,而二级缓存需要手动配置; - 适当提到一级缓存适用于高频度读取操作,而二级缓存适用于缓存经常被读取的数据。 最后,可以以自己的理解对Mybatis缓存的优势和适用场景进行总结,展示对Mybatis缓存的深入理解和实际运用经验。 ### 回答3: MyBatis是一种流行的Java持久化框架,提供了一级缓存二级缓存来提升性能。在面试中,回答如下: 一级缓存:MyBatis的一级缓存是指在同一个SqlSession内部的缓存。当在同一个SqlSession中执行相同的查询时,MyBatis会首先从缓存中查询结果,而不会去数据库查询。这大大提高了查询的性能。默认情况下,MyBatis开启了一级缓存二级缓存:MyBatis的二级缓存是指在不同的SqlSession之间共享的缓存。当在一个SqlSession中执行查询后,查询结果会被缓存下来,当再次执行相同的查询时,MyBatis会从二级缓存中获取结果,而不会再次去数据库查询。因为二级缓存是跨SqlSession的,所以可以在不同的SqlSession中共享查询结果,进一步提高了性能。需要注意的是,二级缓存是需要手动开启和配置的。 在面试中,可以回答如下的点来介绍一级缓存二级缓存: - 一级缓存是SqlSession级别的缓存,可以提高同一个SqlSession中相同查询的性能。 - 二级缓存是共享的缓存,可以提高跨SqlSession的查询性能。 - 一级缓存默认开启且无需手动配置,而二级缓存需要手动配置开启。 - 一级缓存是默认的缓存级别,而二级缓存是可选的。 - 一级缓存的生命周期是SqlSession级别的,而二级缓存的生命周期是应用级别的。 - 一级缓存二级缓存可以提高查询性能,但在并发环境下需要注意缓存的同步和数据一致性,避免出现脏读问题。 在面试中,除了回答上述内容,还可以结合自己的实际项目经验,分享在使用MyBatis缓存时遇到的问题和解决方案,以及在配置和使用缓存时的注意事项等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值