侧边栏壁纸
博主头像
清如许博主等级

努力成长为一颗大树,一半洒落阴凉,一半沐浴阳光,非常沉默非常骄傲,从不依靠从不寻找

  • 累计撰写 58 篇文章
  • 累计创建 36 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

mybatis的二级缓存,以及如何利用redis优化mybatis缓存?.md

清如许
2020-10-07 / 0 评论 / 0 点赞 / 429 阅读 / 1,118 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

学习redis,缓存是很重要的一块

1.1 为什么要使用缓存?

为mybatis增加缓存功能,可有利用减少数据库访问

系统运行的瓶颈很重要的一个因素就是数据库,
减少数据库的访问压力,可以提高整个系统的吞吐量。

什么是缓存?

将SQL语句,以及对应的查询结果存在服务器内存中,这一块内存存储区域,被我们称之为缓存。

如果之后再执行该同样的SQL语句,则直接从缓存中去取,不再去查询数据库,可减小数据库的访问压力。

缓存的核心使用思路

  1. 开启缓存
  2. 缓存的作用范围 缓存中的数据可以使用的范围
  3. 脏数据的处理
    脏数据:缓存是数据库中热点数据的备份,当数据库中的热点数据发生变化时,缓存也要和数据库保持一致,否则相应的数据成为脏数据。

1.2 mybatis现有的缓存

mybatis的缓存分成一级缓存和二级缓存

一级缓存也称之为SqlSession级别的缓存,默认开启,只一次查询有效,作用范围太小,意义不大。
脏数据的处理 :执行增删改有可能造成脏数据,一旦执行增删改立刻清空缓存。

二级缓存称之为SqlSessionFactory级别的缓存,
通常我们所说的缓存默认指的就是二级缓存。

二级缓存使用步骤

  1. 开启二级缓存 (如果和spring整合,默认已经开启)
    若没有,要在mybatis-config.xml中配置一下信息:
<settings>
	<setting name = "cacheEnabled"  value="true" /> 
</settings>
  1. 在mapper文件增加 < cache/>

*Mapper.xml中配置:

<cache />

只有添加了cache标签的mapper文件中的查询结果才会放置到对应的二级缓存中

  1. 将需要存储到缓存中的对象实现序列化接口

  2. 二级缓存作用范围
    同1个namespace下

  3. 脏数据的处理
    执行同1个namespace下的增删改,自动清空该namespace下的缓存

内置的二级缓存通常也不用。
内置的二级缓存本身有namespace的问题,并且不支持持久化。
所以平时主要用:Ehcache 独立的缓存组件,使用纯Java编写。
准备工作:引入相关jar包 ehcache-core.jar mybatis-ehcache.jar

使用步骤:

  1. 开启 缓存,Config.xml中配置和上面一样
  2. mapper.xml中配置,cache标签要加一个type属性指向我们自定义的cache
    在这里插入图片描述
  3. src下添加ehcache.xml
    在这里插入图片描述
    Encache作用于整个项目中 。
    对脏数据的处理:执行增删改,立刻清空缓存中的数据。

注意:低版本的mybatis配合ehcache有问题,需要升级mybatis到3.2以上
另外ehcache.xml 需要添加updateCheck=”false” 禁用检查更新
在这里插入图片描述

说了这么多,

如何使用redis优化mybatis缓存

mybatis已经实现了二级缓存,为什么使用redis对其优化???

mybatis本身二级缓存的查询结果要存储在当前服务器的JVM虚拟机中,如果缓存的数据量过大会造成jvm服务器臃肿缓慢,大量占用内存空间。

所以我们最好将缓存的数据从tomcat服务器上转移到redis服务器上,redis存取速度快,并且是一个独立进程和jvm没有关系。

实现步骤

  1. 添加jar包
    在这里插入图片描述
  2. 在mapper文件中,增加自定义二级缓存的实现类配置
    在这里插入图片描述
  3. 在src下,增加一个redis.properties配置文件,指明要连接redis数据库的ip和端口号
    默认是连接本地的redis
    在这里插入图片描述
    总结:为了减少mysql数据库的查询压力,借助mybatis二级缓存,让多用户共享查询结果
    前提执行的SQL语句是相同的。但是项目运行过程中,发现二级缓存存储的数据量越来越大,大量占用了当前JVM的空间,为了解决这个问题,使用redis数据库存储缓存的数据
0

评论区