学习redis,缓存是很重要的一块
1.1 为什么要使用缓存?
为mybatis增加缓存功能,可有利用减少数据库访问
系统运行的瓶颈很重要的一个因素就是数据库,
减少数据库的访问压力,可以提高整个系统的吞吐量。
什么是缓存?
将SQL语句,以及对应的查询结果存在服务器内存中,这一块内存存储区域,被我们称之为缓存。
如果之后再执行该同样的SQL语句,则直接从缓存中去取,不再去查询数据库,可减小数据库的访问压力。
缓存的核心使用思路
开启缓存
缓存的作用范围 缓存中的数据可以使用的范围
脏数据的处理
脏数据:缓存是数据库中热点数据的备份,当数据库中的热点数据发生变化时,缓存也要和数据库保持一致,否则相应的数据成为脏数据。
1.2 mybatis现有的缓存
mybatis的缓存分成一级缓存和二级缓存
一级缓存也称之为SqlSession级别的缓存,默认开启,只一次查询有效,作用范围太小,意义不大。
脏数据的处理 :执行增删改有可能造成脏数据,一旦执行增删改立刻清空缓存。
二级缓存称之为SqlSessionFactory级别的缓存,
通常我们所说的缓存默认指的就是二级缓存。
二级缓存使用步骤
- 开启二级缓存 (如果和spring整合,默认已经开启)
若没有,要在mybatis-config.xml中配置一下信息:
<settings> <setting name = "cacheEnabled" value="true" /> </settings>
- 在mapper文件增加 < cache/>
*Mapper.xml中配置:
<cache />
只有添加了cache标签的mapper文件中的查询结果才会放置到对应的二级缓存中
- 将需要存储到缓存中的对象实现序列化接口
- 二级缓存作用范围
同1个namespace下 - 脏数据的处理
执行同1个namespace下的增删改,自动清空该namespace下的缓存
内置的二级缓存通常也不用。
内置的二级缓存本身有namespace的问题,并且不支持持久化。
所以平时主要用:Ehcache 独立的缓存组件,使用纯Java编写。
准备工作:引入相关jar包 ehcache-core.jar mybatis-ehcache.jar
使用步骤:
- 开启 缓存,Config.xml中配置和上面一样
- mapper.xml中配置,cache标签要加一个type属性指向我们自定义的cache
src下添加ehcache.xml
- Encache作用于整个项目中 。
对脏数据的处理:执行增删改,立刻清空缓存中的数据。
注意:低版本的mybatis配合ehcache有问题,需要升级mybatis到3.2以上
另外ehcache.xml 需要添加updateCheck=”false” 禁用检查更新
说了这么多,
如何使用redis优化mybatis缓存
mybatis已经实现了二级缓存,为什么使用redis对其优化???
mybatis本身二级缓存的查询结果要存储在当前服务器的JVM虚拟机中,如果缓存的数据量过大会造成jvm服务器臃肿缓慢,大量占用内存空间。
所以我们最好将缓存的数据从tomcat服务器上转移到redis服务器上,redis存取速度快,并且是一个独立进程和jvm没有关系。
实现步骤
- 添加jar包
- 在mapper文件中,增加自定义二级缓存的实现类配置
- 在src下,增加一个redis.properties配置文件,指明要连接redis数据库的ip和端口号
默认是连接本地的redis
总结:为了减少mysql数据库的查询压力,借助mybatis二级缓存,让多用户共享查询结果
前提执行的SQL语句是相同的。但是项目运行过程中,发现二级缓存存储的数据量越来越大,大量占用了当前JVM的空间,为了解决这个问题,使用redis数据库存储缓存的数据