缓存双雄对决:CPU三级缓存与Mybatis二级缓存的深度解析与性能密码(第四章)

发布于:2025-08-14 ⋅ 阅读:(21) ⋅ 点赞:(0)

1、电脑缓存

1.1 缓存的工作原理:

电脑的缓存当cpu进行读取缓存数据的时候,是先从缓存的数据进行查找的,读取之后再输入到电脑cpu里面进行处理的,如果没有对应的缓存文件给cpu进行处理的话,那电脑就会从内存中的数据进行处理并给cpu进行处理。这一段时间会相比找到缓存文件来要慢的多。cpu处理完数据之后,就会把处理完的的数据模块进行保存,这个就是缓存文件,这样等以后在进行读取这个文件就会快的多,不会像以前那么慢,并且不会重复读取内存中的数据了。

1.2 一级缓存

一级缓存基本上都是内置在cpu的内部和cpu一个速度进行运行,能有效的提升cpu的工作效率。一级缓存越多,cpu的工作效率就会越来越高,是cpu的内部结构限制了一级缓存的容量大小,使一级缓存的容量都是很小的。

1.3 二级缓存

二级缓存,主要作用是协调一级缓存和内存之间的工作效率。cpu首先用的是一级内存,当cpu的速度慢慢提升之后,一级缓存就不够cpu的使用量了,这就需要用到二级内存。当然二级内存会比一级内存的缓存的效率要低很多,但是相比容量来说二级内存的容量要比一级的容量要大很多。一级内存和二级内存主要是为cpu的处理数据的时候临时进行数据交换的时候使用的。

1.4 三级缓存

三级缓存和一级缓存与二级缓存的关系差不多,是为了在读取二级缓存不够用的时候而设计的一种缓存手段,在有三级缓存cpu之中,只有大约百分之五的数据需要在内存中调取使用,这能提升cpu不少的效率,从而cpu能够高速的工作。

1.5 主流CPU

amd和intel:amd型号的cpu只用一级缓存和二级缓存,没有三级缓存。但是intel的cpu恰恰相反,有二级缓存和三级缓存,但是没有一级缓存。

2、Mybatis缓存

2.1 一级缓存

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。

工作原理:

2.2 二级缓存

为什么有了一级缓存,还要提供二级缓存?

1、二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。

2、实际开发中,MyBatis通常和Spring进行整合开发。Spring将事务放到Service中管理,对于每一个service中的sqlsession是不同的,这是通过mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer创建sqlsession自动注入到service中的。 每次查询之后都要进行关闭sqlSession,关闭之后数据被清空。所以spring整合之后,如果没有事务,一级缓存是没有意义的。

工作原理:

总结:

对于查询多,commit少,并且对结果实时性要求不高的操作,可以使用二级缓存;

二级缓存的弊端:

如果对表的操作在多个namespace下,那么得到的数据可能是错误的。

eg:

订单和订单详情,orderMapper、orderDetailMapper。在查询订单详情时我们需要把订单信息也查询出来,那么这个订单详情的信息被二级缓存在orderDetailMapper的namespace中,这个时候有人要修改订单的基本信息,那就是在orderMapper的namespace下修改,他是不会影响到orderDetailMapper的缓存的,那么你再次查找订单详情时,拿到的是缓存的数据,这个数据其实已经是过时的。

使用二级缓存的前提条件:

1)对该表的操作与查询都在同一个namespace下,其他的namespace如果有操作,就会发生数据的脏读。

2)对关联表的查询,关联的所有表的操作都必须在同一个namespace。


网站公告

今日签到

点亮在社区的每一天
去签到