三点:一级缓存,二级缓存,redis缓存(分布式系统一般使用这个)
1.一级缓存
![](https://img.haomeiwen.com/i25737031/fb5912d6f6263f3f.png)
![](https://img.haomeiwen.com/i25737031/25a0a287596b0a52.png)
一级缓存 localcache:sqlsession级别
2. 二级缓存
![](https://img.haomeiwen.com/i25737031/fe54a8d7b91ceade.png)
二级缓存的开启:
配置中
!--开启⼆级缓存-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
mapper.xml中
<!--开启⼆级缓存-->
<cache></cache>
对单个方法useCache和flushCache
<select id="selectUserByUserId" useCache="false"
resultType="com.lagou.pojo.User" parameterType="int">
select * from user where id=#{id}
</select>
mybatis中还可以配置userCache和flushCache等配置项,userCache是⽤来设置是否禁⽤⼆级缓 存
的,在statement中设置useCache=false可以禁⽤当前select语句的⼆级缓存,即每次查询都会发出 sql
去查询,默认情况是true,即该sql使⽤⼆级缓存
<select id="selectUserByUserId" flushCache="true" useCache="false"
resultType="com.lagou.pojo.User" parameterType="int">
select * from user where id=#{id}
</select>
设置statement配置中的flushCache="true”属性,默认情况下为true,即刷新缓存,如果改成false则 不
会刷新。使⽤缓存时如果⼿动修改数据库表中的查询数据会出现脏读。
二级缓存:mapper和namespace级别
sqlsession 调用close或commit时才会放到缓存中,否则只会放入
3.redis缓存(适合分布式系统中的缓存)
![](https://img.haomeiwen.com/i25737031/e618737afe37cf2f.png)
使用
<cache type="org.mybatis.caches.redis.RedisCache" />
或
@CacheNamespace(implementation = RedisCache.class)//开启二级缓存
注意信息
查询顺序:查询->二级缓存->一级缓存->数据库
开启二级缓存后,executor走CachingExecutor实现
网友评论