简介
1、什么是缓存
存在于内存中的临时数据。
2、为什么使用缓存
减少和数据库的交互次数,提高执行效率。
3、什么样的数据能使用缓存,什么样的数据不能使用
适用缓存:
- 经常查询并且不经常改变的。
- 数据的正确与否对最终结果影响不大的。
不适用缓存:
- 经常改变的数据
- 数据的正确与否对最终结果影响很大的。
- 例如:商品的库存,银行的汇率,股市的牌价。
一级缓存
- 一级缓存是 SqlSession 范围的缓存,是一直开启的,无法关闭
一级缓存失效的四种情况
一级缓存失效情况:就是没有使用到当前的一级缓存,还需要再向数据库中发起一次查询请求!
- SqlSession不同,每个SqlSession中的缓存相互独立
- 查询语句不同
- SqlSession相同,但是两次查询之间执行了增删改操作!
- 执行SqlSession.clearCache(),手动清除缓存。
二级缓存
二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
- 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;
工作机制:
- 一个会话查询一条数据,这个数据会被放在当前会话的一级缓存中;
- 当前会话关闭之后,一级缓存中的数据会被保存到二级缓存中;
- 当新的会话查询信息时,可以从二级缓存中获取内容;
- 不同的mapper查出的数据会放在自己对应的缓存(map)中;
mybatis-config.xml
<setting name="cacheEnabled" value="true"/>
对应Mapper.xml
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true" />
原理
所有的实体类先实现序列化接口
public void getTeacherById(){
//查询新的数据,缓存中没有,查询数据库,会保存到一级缓存中
SqlSession sqlSession= MybatisUtils.getSqlSession();
TeacherMapper mapper= sqlSession.getMapper(TeacherMapper.class);
Teacher t = mapper.getTeacherById(1);
System.out.println(t);
sqlSession.close();
//当前会话关闭之后,一级缓存内的数据自动转存到二级缓存中
SqlSession sqlSession2= MybatisUtils.getSqlSession();
TeacherMapper mapper2= sqlSession2.getMapper(TeacherMapper.class);
Teacher t2 = mapper2.getTeacherById(1);
System.out.println(t2);
//缓存中不包含该条数据,将查询数据库,并保存到一级缓存中
Teacher t3 = mapper2.getTeacherById(2);
System.out.println(t3);
//一级缓存中包含该数据,直接使用
Teacher t4 = mapper2.getTeacherById(2);
System.out.println(t4);
sqlSession2.close();
}
- 查出的数据会默认先放在一级缓存中
- 只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中
- 只要开启了二级缓存,我们在同一个Mapper中的查询,就可以在二级缓存中拿到数据