1、什么是缓存[Cache]

  • 存在内存中的临时数据。
  • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

2、为什么要使用缓存

  • 减少和数据库的交互次数,减少系统开销,提高系统效率。

3、什么样的数据需要使用缓存

  • 经常查询且不易改变的数据

4、Mybatis缓存

  • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。
  • MyBatis系统中默认定义了两级缓存:一级缓存二级缓存

    • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
    • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

5、一级缓存

一级缓存也叫本地缓存:

  • 与数据库同一次会话期间查询到的数据会放在本地缓存中。
  • 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;

6、一级缓存失效的四种情况

  • sqlSession不同
  • sqlSession相同,查询条件不同
  • sqlSession相同,两次查询之间执行了增删改操作!
  • sqlSession相同,手动清除一级缓存
@Test
public void testQueryUserById(){
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.queryUserById(1);
System.out.println(user); session.clearCache();//手动清除缓存 User user2 = mapper.queryUserById(1);
System.out.println(user2); System.out.println(user==user2); session.close();
}

所以说,一级缓存就是一个map

7、二级缓存

  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;
  • 工作机制

    • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
    • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
    • 新的会话查询信息,就可以从二级缓存中获取内容;
    • 不同的mapper查出的数据会放在自己对应的缓存(map)中;

使用步骤:

  • 核心配置文件

    <setting name="cacheEnabled" value="true"/>
  • 去每个mapper.xml中配置使用二级缓存,这个配置非常简单;
方式一:
<cache/> 方式二:
官方示例=====>查看官方文档
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

8、结论

  • 只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
  • 查出的数据都会被默认先放在一级缓存中
  • 只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中

原理图:

最新文章

  1. C#中事件的使用
  2. [翻译]LSP程序的分类
  3. [资源] Getting started with Tensorflow
  4. wikioi 1203 判断浮点数是否相等
  5. Java 包装类中的静态函数
  6. 动画气泡指示当前滑动值--第三方开源--DiscreteSeekbar
  7. .NET混淆工具 (Dotfuscator Professional Edition)
  8. python IDE ulipad配置使用
  9. 生成免费SSL通配证书
  10. 我的第一个python web开发框架(23)——代码版本控制管理与接口文档
  11. 使用google wire解决依赖注入
  12. BZOJ 1443 游戏(二分图博弈)
  13. vue 树状图数据的循环 递归循环
  14. hive的行列转换
  15. 【转载】Eclipse快捷键 10个最有用的快捷键
  16. Elasticsearch使用filter进行匹配关系and,or,not,range查询
  17. 继电器是如何成为CPU的(1)【转】
  18. Activiti - 新一代的开源 BPM 引擎 (zhuan)
  19. 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]
  20. [转]时序列数据库武斗大会之什么是TSDB

热门文章

  1. 002-05-RestTemplate 使用常见问题-非200请求捕获
  2. spring boot集成Websocket
  3. ES6深入浅出-5 新版对象-1.如何创建对象
  4. ANSI转义序列
  5. intellij maven配置与使用
  6. HTML布局排版手机上浏览的网页
  7. Web书写Test Case时需要考虑的检查点
  8. SELinux安全子系统的学习
  9. Linux【Ubuntu】安装docker
  10. django使用pyecharts(4)----django加入echarts_增量更新