Java面试经常问到一级缓存和二级缓存,今天就给大家重点详解一级缓存和二级缓存原理与区别@
缓存
缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存可以避免频繁与数据库进行交互,从而提高查询响应速度。
提供了对缓存的支持,分为一级缓存和二级缓存mybatis一级缓存和二级缓存,如下图所示:
我们先大致了解下一级缓存与 二级缓存:
一级缓存:级别的缓存,缓存的数据只在内有效。
二级缓存:级别的缓存,同一个公用这一个缓存,所以对是共享的,二级缓存需要我们手动开启。
下面我们再分别详解两者的原理与区别。
1.为什么需要一级缓存
当我们使用进行数据库的操作时候,会创建一个来进行一次数据库的会话,会话结束则关闭对象。
如果我们很有可能多次查询完全相同的sql语句,每一次查询都查询一次数据库,那查询数据库代价是比较大的,这会导致系统的资源浪费。
为了解决这个问题,对每一次会话都添加了缓存操作,不用相同的SQL每次都需要查询数据库,这就是一级缓存的作用。
2.一级缓存的实现
我们知道对的操作,内部都是通过来执行的,的生命周期和是一致的。
在中创建了本地缓存(一级缓存),如下图所示:
大致的流程如下:
第一次查询用户id信息,先去缓存中查询是否有,如果没有,从数据库中查询用户信息,得到用户信息后在将用户信息储存到一级缓存中。
如果去执行操作(插入、更新、删除),清空中的一级缓存,保证缓存中始终保存的是最新的信息,避免脏读。
第二次查询用户id信息,先去缓存中查询,如缓存中有,直接从缓存中获取。
注意:两次查询须在同一个中完成,否则将不会走的一级缓存。
在与进行整合开发时,事务控制在中进行,重复调用两次将不会走一级缓存,因为在第二次调用时方法结束,就关闭了。
3.一级缓存配置
一级缓存的范围有和两种,默认是。
如果不想使用一级缓存,可以把一级缓存的范围指定为,这样每次执行完一个中的语句后都会将一级缓存清除。
如果需要更改一级缓存的范围,可以在的配置文件中,在下通过指定。
二级缓存1.为什么需要二级缓存?
一级缓存最大的共享范围就是一个内部,那么如果多个 需要共享缓存,则需要开启二级缓存。
2.二级缓存的实现
开启二级缓存后,会使用 装饰 ,进入一级缓存的查询流程前,先在 进行二级缓存的查询mybatis一级缓存和二级缓存,具体的工作流程如下所示。
二级缓存开启后,同一个 下的所有操作语句,都影响着同一个 Cache,即二级缓存被多个 共享,是一个全局的变量。
当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
是默认关闭二级缓存的,因为对于增删改操作频繁的话,那么二级缓存形同虚设,每次都会被清空缓存。
一级缓存与二级缓存的区别
1)一级缓存 的一级缓存是指,一级缓存的作用域是, 默认开启一级缓存。
在同一个中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。当执行SQL时候两次查询中间发生了增删改的操作,则的缓存会被清空。
每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。的内部缓存使用一个,key为++sql语句。Value为查询出来的结果集映射成的java对象。执行、、等操作后会清空该缓存。
2) 二级缓存是默认不开启的,作用于一个,是级别的,多个使用同一个的sql能够使用二级缓存。
以上
合集●架构技术干货
1.分布式架构设计从0到1全部合集,强烈建议收藏!
2.Java多线与并发编程从0到1全部合集,强烈建议收藏!
3.JVM虚拟机系从0到1全部合集,强烈建议收藏!
4.系列从0到1全部合集,强烈建议收藏!
5.史上最强消息队列MQ万字图文总结,强烈建议收藏!
6.高并发架构设计从0到1全部合集,强烈建议收藏!