学习MyBatis必知必会(9)~缓存机制(一级缓存、二级缓存、第三方缓存技术redis、ehcache)

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 学习MyBatis必知必会(9)~缓存机制(一级缓存、二级缓存、第三方缓存技术redis、ehcache)

一、缓存机制

使用缓存可以使应用更快地获取数据,避免频繁的数据库交互操作,尤其是在查询越多,缓存命中率越高 的情况下,缓存的作用就越明显.


1、缓存原理:Map

■ 查询时,先从缓存区查询:找到,返回数据;找不到:到数据库中查询,然后把查询的数据放进缓存,供下次使用,然后返回数据

缓存是在内存,速度肯定是比存储在磁盘的数据库更快,减轻数据库的访问压力


2、缓存相关的概念:

(1)哪一些数据适合进行缓存:经常被查询但是很少被修改的数据【读远远大于写操作的数据】
(2)缓存相关的属性:

■ 命中率:从缓存中查询出来的数量占总查询的数量

■ 最大对象数量:缓存区中最多存储多少个数据,超出的时候可以写到硬盘中【序列化】

■ 最大空闲时间:停留在缓存空间的时间,避免出现"占着茅坑不拉。。。"

● 在MyBatis中实现缓存,只需实现Cache接口即可。


3、MyBatis 缓存【一级缓存 和 二级缓存】:

一级缓存[本地缓存,默认自动开启,不能关闭,性能提升较差]:SqlSession级别的,每次创建新的SqlSession对象,一级缓存的空间就会发生改变。不同是SqlSession对象不可以共享数据

二级缓存[查询缓存,需要手动开启和配置]:mapper级别的,作用域是mapper文件的同一个namespace。二级缓存应该和namespace绑定在一起,不同是SqlSession对象可以共享数据。


● 默认的缓存是缓存到java的进程(jvm的内存空间)中,若是缓存内容过多,会出现内存溢出(OOM),需要选择第三方的缓存技术,例如redis、ehcache。


3-1、MyBatis中一级缓存的情况:【基于SqlSession


image.png


■ 一级缓存【本地缓存】,默认开启,不能关闭。
  • 好比是在SqlSession中存在一个Map,用来缓存查询出来的对象。
■ 清空一级缓存:调用Sqlsession对象的cleanCache方法。


SqlSession session = MyBatisUtil.getSession();
//清空一级缓存
session.clearCache();
■ 一级缓存:对性能提升是有限的,每一次操作,我们都使用新的SqlSession对象,SqlSession之间不共享一级缓存。
  • 真正提升性能---->二级缓存


3-2、MyBatis中二级缓存的情况:


image.png


■ 使用二级缓存的步骤:

(1) 全局配置文件中启用二级缓存

<settings>
    <!-- 启用二级缓存,缺省是默认启用 -->
    <setting name="cacheEnabled" value="true"/>
</settings>

(2) mapper文件中,使用cache元素,即namespce和缓存进行绑定:

<cache/>

(3)对于要放入二级缓存的对象要实现序列化接口【因为:超出缓存范围的时候可以写到硬盘中【序列化】】

public class Employee implements Serializable{
}


■ 使用二级缓存配置的一些细节(当启用二级缓存后):

(1)mapper文件中所有select元素会默认使用缓存

(2)在大多数情况下,针对列表查询【查询多条数据】,设置为不缓存【useCache="false"】,只有sql和参数相同时,才会使用到缓存:

<!-- mapper 文件--> 
<select id="listAll" resultMap="BaseResultMap" useCache="false">
  select id, name, dept_id from employee2
</select>

(3)一般,对get方法设置缓存查询【useCache="true"】:

<!-- mapper 文件--> 
<select id="get" resultMap="BaseResultMap" useCache="true">
  select id, name, dept_id from employee2 where id = #{id}
</select>

(4)默认情况下,insert、delete、update操作都会去刷新缓存,对于删除和更改操作,刷新缓存操作是合理的,但是插入对象操作是没必要刷新缓存的

<insert id="" flushCache="false">
</insert>



4、整合第三方缓存技术

4-1、EhCache:第三方的缓存技术

(1) 依赖【注意看好版本】:

□ jar包的话---方式一:可以直接在github找到对应的项目,看readme提示去下载 zip包【就包含了所需要的jar包】
□ jar包的话---方式二:到maven仓库下载对应的jar包
  • ehcache-core.jar
  • mybais-ehcache.jar
  • slf4j-api.jar
  • slf4j-log4j.jar

(2) ehcache配置:

  • ehcache配置文件:ehcache.xml
  • 映射文件中通过cache元素的type设置为"org.mybatis.caches.ehcache.EhcacheCache"
<!-- 映射文件中使用Ehcache技术 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

配置好后就可以直接使用啦



4-2、redis缓存中间件:第三方的缓存技术

(1) 安装redis服务 链接:https://github.com/MicrosoftArchive/redis/tags

(2) 依赖【注意看好版本】:

  • mybais-redis.jar

(3) redis配置:

  • ehcache配置文件:redis.properties
  • 映射文件中通过cache元素的type设置为"org.mybatis.caches.redis.RedisCache"
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
NoSQL Java Redis
实现基于Redis的分布式锁机制
实现基于Redis的分布式锁机制
|
2月前
|
SQL 缓存 Java
MYBATIS缓存
MYBATIS缓存
|
2月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
159 0
|
1天前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
1月前
|
SQL 缓存 Java
【面试官】Mybatis缓存有什么问题吗?
面试官:你说下对MyBatis的理解?面试官:那SqlSession知道吧?面试官:Mybatis的缓存有哪几种?面试官:那Mybatis缓存有什么问题吗?面试官:Mybatis分页插件是怎么
【面试官】Mybatis缓存有什么问题吗?
|
21天前
|
缓存 算法 Java
关于MyBatis的缓存详解
MyBatis 的缓存机制非常灵活,可以通过简单的配置来满足不同的性能需求。合理地使用缓存可以显著提高应用程序的性能,尤其是在处理大量数据库查询时。然而,开发者需要注意缓存的一致性和并发问题,特别是在使用可读写缓存时。
|
26天前
|
NoSQL Redis 开发工具
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
|
26天前
|
NoSQL Redis
Redis性能优化问题之禁用内存大页,如何解决
Redis性能优化问题之禁用内存大页,如何解决
|
8天前
|
NoSQL Redis
Redis——设置最大内存 | key淘汰机制
Redis——设置最大内存 | key淘汰机制
19 0