首页 > 其他分享 >【学习笔记】缓存

【学习笔记】缓存

时间:2023-01-12 12:23:19浏览次数:47  
标签:mapper 缓存 二级缓存 笔记 查询 学习 sqlSession println

缓存

1.什么是缓存

缓存是存在内存中的临时数据。

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

为什么使用缓存?

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

 

什么样的数据能使用缓存?

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

 

2.Mybatis缓存

Mybatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存,缓存可以极大地提升查询效率。

Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存

  • 默认情况下只有一级缓存开启(一级缓存也是sqlSession级别的,也成为本地缓存)

  • 二级缓存需要手动开启和配置(二级缓存基于namespace的缓存)

  • 为了提高扩展性,Mybatis定义了缓存接口Cache,我们可以通过实现这个接口来自定义缓存

 

3.一级缓存

一级缓存是默认开启的,存在区间是sqlSession的开启到关闭

使用场景:每次查询相同的数据,才会使用到一级缓存

举例:

public void test01(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    CityMapper mapper = sqlSession.getMapper(CityMapper.class);
​
    City city = mapper.querycityById(1);
    System.out.println(city);
    System.out.println("================================");
​
​
    City city1 = mapper.querycityById(1);
    System.out.println(city1);
​
    sqlSession.close();
​
​
}

我们查询同一个数据

image-20230112110243165

可以发现,sql语句只执行了一次,也就是说,在这个sqlSession中,查询的数据被保存在缓存中,再去查询这条数据,就直接从缓存中取,不需要在查询数据库了。

关于一级缓存失效的情况:

  • 查询不同的数据

  • 通过不同的mapper.xml查询

  • 增删改数据库的表,无论是不是你要查询的数据,缓存都会失效

    public void test01(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        CityMapper mapper = sqlSession.getMapper(CityMapper.class);
    ​
        City city = mapper.querycityById(1);
        System.out.println(city);
    ​
        mapper.updateCity(new City(2,"德州",800));
    ​
        System.out.println("================================");
    ​
    ​
        City city1 = mapper.querycityById(1);
        System.out.println(city1);
    ​
        sqlSession.close();
    ​
    ​
    }

    我们先查询id为1的数据,然后修改id为2的数据,再去查询id为1的数据

    image-20230112111408862

    可以看到虽然修改的不是id为1的数据,但是第二次却执行了sql,说明没有从缓存中拿,缓存失效

 

  • 手动清理缓存

    用的是sqlSession的clearCache() 方法

    sqlSession.clearCache();

    image-20230112111717894

 

 

4.二级缓存

由于一级缓存的作用域只是在一个sqlSession中,作用域太小,所以需要二级缓存

二级缓存是基于namespace的缓存,作用域就是一个mappe.xml

工作机制:

  • 一个会话(sqlSession)查询一条语句,这个数据就被保存在一级缓存中

  • 当该会话关闭后,这个一级缓存就没了,一级缓存中的数据就被保存到二级缓存中

  • 新的会话查询该数据,就直接从二级缓存中获取数据

  • 不同的mapper查出的数据保存在自己的缓存中

二级缓存的使用:

在要使用缓存的mapper.xml中使用 标签 < cache /> 即可

还可以设置一些属性

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

可用的清除策略有:

  • LRU – 最近最少使用:移除最长时间不被使用的对象。

  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。

  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

 

举例:

public void test01(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
​
    CityMapper mapper = sqlSession.getMapper(CityMapper.class);
​
    City city = mapper.querycityById(1);
    System.out.println(city);
    sqlSession.close();
​
    System.out.println("================================");
​
    SqlSession sqlSession2 = SqlSessionUtils.getSqlSession();
    CityMapper mapper2 = sqlSession2.getMapper(CityMapper.class);
​
    City city1 = mapper2.querycityById(1);
    System.out.println(city1);
​
    sqlSession2.close();
​
}

我们先创建一个sqlSession,然后查询数据,再关闭sqlSession

然后在创建一个sqlSession,在查询该数据,在关闭

这时,这条数据,就是从一级缓存中放到二级缓存,然后从二级缓存中被取出来

image-20230112114311666

 

 

执行的顺序:二级缓存--->一级缓存--->数据库

 

标签:mapper,缓存,二级缓存,笔记,查询,学习,sqlSession,println
From: https://www.cnblogs.com/wztblogs/p/17046270.html

相关文章

  • 机器学习流程是什么?简述机器学习流程!
    1、抽象成数学问题明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。这里的抽象成数学问题,指的明确我们可以获......
  • 2022年深度学习在时间序列预测和分类中的研究进展综述
    时间序列预测的transformers的衰落和时间序列嵌入方法的兴起,还有异常检测、分类也取得了进步2022年整个领域在几个不同的方面取得了进展,本文将尝试介绍一些在过去一年左右......
  • RenderDoc 学习使用(二):Android平台真机环境下对特殊项目进行截帧分析
    修改真机debuggable值使用RenderDoc在真机环境进行调试,需要项目:debuggable=true。除了每个apk中指定的debuggable外,这个值还可以在系统中全局指定。换句话说,只要把系统值......
  • 这些是最热门的机器学习方法!
    在上文中我们已经了解了机器学习的原理,就是模仿人类大脑进行学习的过程,通过让机器模仿这种学习过程实现所谓的“智能”。经过近几十年的发展,机器学习的方法也越来越成熟,主......
  • OpenGL ES 2.0编程指导阅读笔记(二)你好,三角形:OpenGL ES 2.0示例
    本章覆盖以下内容:用EGL创建屏上表面加载顶点和片元着色器创建程序对象,附加顶点和片元着色器,并链接程序对象设置视点清除colorbuffer渲染一个简单图元使colorbuff......
  • OpenGL ES 2.0编程指导阅读笔记(三)EGL介绍
    EGL能够管理绘图表面。EGL提供了以下机制:和本地窗口系统进行通信;查询可用的绘图表面类型和配置;创建绘图表面;在OpenGLES2.0和其他图形渲染API之间同步渲染;管理渲染......
  • 案例方式学习JavaScript双重for循环
    先给大家分享一些JavaScript的相关资料: ​​认识JavaScript到初体验​​​​JavaScript注释以及输入输出语句​​​​JavaScript变量的使用、语法扩展、命名规范​​​​......
  • JavaScript 流程控制-实际案例学习if语句
     JavaScript前文回顾: ​​认识JavaScript到初体验​​​​JavaScript注释以及输入输出语句​​​​JavaScript变量的使用、语法扩展、命名规范​​​​JavaScript数据类......
  • 作为一个程序员,需要学习多少技能?
    作为一个程序员,需要学习多少技能?1、学好"物理"。2、学好“化学”。3、学好“生物”。4、学好“历史”。5、学好“文学”。6、学好“建筑”。7、学好“艺术”。8、学好“经济......
  • 明德扬FPGA网络班学习问题答疑
    关于课程内容我今年大一,想学FPGA,可是完全没有基础可以学习吗?明德扬科教的教学以潘老师的《潘文明至简设计法》为中心,其核心就是一个“简”字。除了在设计思路、过程、结果等......