System.out.println(“================================”);
SqlSession sqlSession2 = sqlSessionFactory.openSession();
EmpMapper mapper2 = sqlSession2.getMapper(EmpMapper.class);
List list2 = mapper2.selectAllEmp();
for (Emp emp : list2) {
System.out.println(emp);
}
sqlSession.close();
sqlSession2.close();
}
参数不一致,缓存失效
发送过程中发生了数据的修改,缓存失效
@Test
public void test03() {
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp empByEmpno = mapper.findEmpByEmpno(1111);
System.out.println(empByEmpno);
System.out.println(“================================”);
empByEmpno.setEname(“zhangsan”);
int i = mapper.updateEmp(empByEmpno);
System.out.println(i);
System.out.println(“================================”);
Emp empByEmpno1 = mapper.findEmpByEmpno(1111);
System.out.println(empByEmpno1);
sqlSession.close();
}
在两次查询期间,手动去清空缓存,缓存失效
@Test
public void test03() {
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp empByEmpno = mapper.findEmpByEmpno(1111);
System.out.println(empByEmpno);
System.out.println(“================================”);
System.out.println(“手动清空缓存”);
sqlSession.clearCache();
System.out.println(“================================”);
Emp empByEmpno1 = mapper.findEmpByEmpno(1111);
System.out.println(empByEmpno1);
sqlSession.close();
}
总结
特点:
-
1.默认就开启了,也可以关闭一级缓存 localCacheScope=STATEMENT
-
2.作用域:是基于sqlSession(默认),一次数据库操作会话。
-
3.缓存默认实现类PerpetualCache ,使用map进行存储的
-
4.查询完就会进行存储
-
5.先从二级缓存中获取,再从一级缓存中获取 * key==> sqlid+sql
失效情况:
-
1.不同的sqlSession会使一级缓存失效
-
2.同一个SqlSession,但是查询语句不一样
-
3.同一个SqlSession,查询语句一样,期间执行增删改操作
-
4.同一个SqlSession,查询语句一样,执行手动清除缓存
二级缓存
二级缓存是namespace级别的缓存,他比一级缓存更加底层,一般情况下Mybatis是默认不开启二级缓存的。
如果需要开启二级缓存那么则需要实现一下两个条件
-
实体类必须序列化
-
在xml配置文件中配置cache标签
基本实现
- 1、全局配置文件中添加如下配置:
- 2、配置EmpMapper.xml映射
-
3、修改实体类必须要实现Serializable接口
-
4、测试实现
@Test
public void test04() {
SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
EmpMapper mapper2 = sqlSession2.getMapper(EmpMapper.class);
Emp empByEmpno = mapper.findEmpByEmpno(1111);
System.out.println(empByEmpno);
sqlSession.close();
Emp empByEmpno1 = mapper2.findEmpByEmpno(1111);
System.out.println(empByEmpno1);
sqlSession2.close();
}
缓存标签属性
-
eviction:表示缓存回收策略,默认是LRU
-
LRU:最近最少使用的,移除最长时间不被使用的对象
-
FIFO:先进先出,按照对象进入缓存的顺序来移除
-
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
-
WEAK:弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象
-
flushInternal:刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
- size:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
-
readonly:只读,true/false
-
true:只读缓存,会给所有调用这返回缓存对象的相同实例,因此这些对象不能被修改。
-
false:读写缓存,会返回缓存对象的拷贝(序列化实现),这种方式比较安全,默认值
@Test
public void test05() {
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp empByEmpno = mapper.findEmpByEmpno(1111);
System.out.println(empByEmpno);
sqlSession.close();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
EmpMapper mapper2 = sqlSession2.getMapper(EmpMapper.class);
Emp empByEmpno2 = mapper2.findEmpByEmpno(1111);
System.out.println(empByEmpno2);
Emp empByEmpno3 = mapper2.findEmpByEmpno(1111);
System.out.println(empByEmpno3);
Emp empByEmpno4 = mapper2.findEmpByEmpno(7369);
System.out.println(empByEmpno4);
Emp empByEmpno5 = mapper2.findEmpByEmpno(7369);
System.out.println(empByEmpno5);
sqlSession2.close();
}
总结
特性:
-
1.默认开启了,没有实现
-
2.作用域:基于全局范围,应用级别。
-
3.缓存默认实现类PerpetualCache ,使用map进行存储的但是二级缓存根据不同的mapper命名空间多包了一层map
-
4.事务提交的时候(sqlSession关闭)
-
5.先从二级缓存中获取,再从一级缓存中获取 *
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
完结
Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。
Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。
Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。
[外链图片转存中…(img-kDAELvph-1712892960041)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-lPI4piHP-1712892960042)]