首页 > 其他分享 >缓存的简介以及Mybatis缓存中一级缓存和二级缓存

缓存的简介以及Mybatis缓存中一级缓存和二级缓存

时间:2024-07-27 14:24:18浏览次数:9  
标签:缓存 一级 查询 会话 二级缓存 Mybatis 数据

简介

我们所有的查询都需要连接数据库,连接数据库比较耗资源,那么如何解决耗资源的问题呢?

        我们可以把一次查询的结果暂存在一个可以直接取到的地方——>内存

        放在内存里的这一些查询的数据就叫缓存,这是什么意思呢,我们再次查询相同数据的时      

        候,直接走缓存,就不用走数据库了

1.什么是缓存【Cache】?
        存在内存中的临时数据。

        将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数

        据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

2.为什么使用缓存?

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

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

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

Mybatis缓存

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

        默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)

        二级缓存需要手动开启和配置,他是基于namespace级别的缓存。

        为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二

        级缓存

一级缓存

一级缓存也叫本地缓存:

        与数据库同一次会话期间查询到的数据会放在本地缓存中。

        以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库

缓存失效的情况:

        1.查询不同的东西

        2.增删改操作,可能会改变原来的数据,所以必定会刷新缓存

        3.查询不同的Mapper

        4.手动清理缓存

小结:一级缓存默认是开启的,只在一次SqlSession中有效,也就是拿到连接到关闭连接这个区间段。一级缓存就类似一个Map。

二级缓存

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

        一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中

        如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一

        级缓存中的数据被保存到二级缓存中

        新的会话查询信息,就可以从二级缓存中获取内容

        不同的mapper查出的数据会放在自己对应的缓存(map)中

步骤

1.开启全局缓存

<!--显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>

2.在要使用二级缓存的Mapper中开启

<!--在当前Mapper.xml中使用二级缓存-->
<cache/>

也可以自定义参数

<!--在当前Mapper.xml中使用二级缓存-->
<cache eviction="FIFO'
       flushInterva1='60000"
       size="512"
       readonly="true"/>

3.测试问题

我们需要将实体类序列化,否则就会报错!

Caused by: java.io.NotserializableException: com.kuang.pojo.user

小结:

  • 只要开启了二级缓存,在同一个Mapper下就有效
  • 所有的数据都会先放在一级缓存中
  • 只有当会话提交,或者关闭的时候,才会提交到二级缓冲中

标签:缓存,一级,查询,会话,二级缓存,Mybatis,数据
From: https://blog.csdn.net/2401_83327821/article/details/140718438

相关文章

  • mybatis plus 使用LambdaQueryWrapper设置复杂的条件查询
    LambdaQueryWrapper提供了许多常用的方法,用于构建查询条件。下面列举一些常用的方法:eq(column,value):等于ne(column,value):不等于gt(column,value):大于ge(column,value):大于等于lt(column,value):小于le(column,value):小于等于like(column,value):模糊......
  • redis的使用场景-热点数据缓存(把经常访问的数据放入缓存减少数据库压力)
    一、使用redis实现(不推荐,会增加业务代码维护)@ServicepublicclassClazzServiceImplimplementsClazzService{@AutowiredprivateClazzDaoclazzDao; //注入mapper@AutowiredprivateRedisTemplate<String,Object>redisTemplate; //调用redis使用@Overridep......
  • 易优CMS模板标签SQL数据查询查询数据表ey_arctype,指定栏目ID的基本信息,不使用数据缓存
    【基础用法】标签:sql描述:用于获取MySQL数据库内容的标签。用法:{eyou:sqlsql=''cachetime='3600'empty='没有数据'}{$field.数据表相应的字段名称}{/eyou:sql}属性:sql=''需要查询的SQL语句cachetime='3600'数据缓存时间,默认缓存25小时,即86400秒empty=''没有数据时显示......
  • mybatis-plus之配置安全
    1.环境SpringBoot2.6.x2.介绍MyBatis-Plus从3.3.2版本开始提供了数据安全保护功能,MyBatis-Plus支持通过加密配置来增强数据库的安全性。3.加密StringrandomKey=AES.generateRandomKey();System.out.println(randomKey);System.out.println(AES.encrypt("data",ra......
  • 缓存框架 Caffeine 的可视化探索与实践
    作者:vivo互联网服务器团队- WangZhiCaffeine作为一个高性能的缓存框架而被大量使用。本文基于Caffeine已有的基础进行定制化开发实现可视化功能。一、背景Caffeine缓存是一个高性能、可扩展、内存优化的Java缓存库,基于Google的GuavaCache演进而来并提供了接近最佳......
  • 一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储
    在高性能计算场景中,往往采用全闪存架构和内核态并行文件系统,以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加,全闪存的高成本和内核客户端的运维复杂性成为主要挑战。JuiceFS,是一款全用户态的云原生分布式文件系统,通过分布式缓存大幅提升I/O吞吐量,并使用成本较......
  • mybatis的二级缓存详解
    MyBatis的二级缓存是一种强大的查询缓存机制,它在默认情况下是关闭的。要启用二级缓存,需要在SQL映射文件中添加 <cache/> 标签。以下是对MyBatis二级缓存的详细解释:1.基本概念一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session。当Session冲......
  • Redis缓存面试问题解析:如何有效管理缓存失效策略?
    在技术面试中,Redis缓存是一个常见的话题。面试官往往会考察候选人对缓存机制的理解以及在实际场景中的应用能力。本文将探讨一个在Redis缓存面试中经常被问到的问题,并深入解析其背后的概念和解决方案。面试问题:如何管理Redis缓存的失效策略?问题描述:在高并发的web应用中,缓存是提......
  • 项目一缓存商品
    文章目录概要整体架构流程技术细节小结概要因为商品是经常被浏览的,所以数据库的访问量就问大大增加,造成负载过大影响性能,所以我们需要把商品缓存到redis当中,因为redis是存在内存中的,所以效率会比MySQL的快.整体架构流程 技术细节我们在缓存时需要保持数据......
  • java包装类型缓存简单探究-Integer为例
    文章目录包装类型缓存自动装箱与valueOf感悟结语包装类型缓存包装类型缓存是什么本文以常用的Integer包装类为例做一个探索,感兴趣可以用类似方法查看其他包装类。我们都知道它会缓存-128到127之间的整数Integer对象。结论大伙都知道。那么我们今天就来探究一下底......