| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 【Java进阶营】Mybatis二级缓存的介绍及使用,使用redis实现二级缓存 -> 正文阅读 |
|
[大数据]【Java进阶营】Mybatis二级缓存的介绍及使用,使用redis实现二级缓存 |
一、二级缓存二级缓存是全局作用域缓存,默认是不开启的,需要手动进行配置。 Mybatis提供二级缓存的接口以及实现,缓存实现的时候要求实体类实现Serializable接口,二级缓存在sqlSession关闭或提交之后才会生效。 1-1、特性:
1-2、实现:
1-3、失效
二、Mybatis的实现2-1、在DeptMapper.xml中添加cache标签2-2、给Dept实现序列化接口2-3、测试2-3-1、同一个sqlSession实现二级缓存如下,在第一次执行之后,需要先对sqlSession进行提交,这样才会把第一次的数据存储到二级缓存中,然后第二次查询的时候就会去二级缓存中查询。 [图片上传失败…(image-413dd0-1650464370190)] 2-3-2、不同的sqlSession实现二级缓存如下,第一个sqlSession关闭之后,第二个sqlSession在查询的时候就会命中二级缓存 [图片上传失败…(image-4750c3-1650464370190)] 2-3-3、二级缓存命中率通过上面的测试,可以看到查询二级缓存都有有一个命中率。 2-4、实现增删改不删除二级缓存上面提到,同一个命名空间如果执行了增删改就会清除当前命名空间的缓存,实际上也可以通过配置,即使执行了增删改操作,也可以不删除缓存。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多 2-4-1、实现删除缓存操作2-4-1-1、DeptMapper.xml中添加更新方法2-4-1-2、编写测试方法如下: 2-4-1-3、测试如下可以看到第三次查询的命中率为0。 [图片上传失败…(image-a5d719-1650464370190)] 2-4-2、实现增删改不删除缓存操作2-4-2-1、给DeptMapper.xml方法添加flushCache=“false”2-4-2-2、测试如下,通过给修改方法添加了flushCache=false,缓存就不会被清除了。 [图片上传失败…(image-7c3d7a-1650464370190)] 2-4-3、增删改不清除缓存的隐患假如在增删改的情况下不清除缓存,就可能产生脏读的可能,举例如下: 这样就产生了脏读的后果,因此在设置flushCache=false的时候,需要根据实际的业务场景慎重选择。 一般这种情况下可以对一些惰性数据进行这样处理,比如一个周期内数据即使发生微小改动,不影响整体业务,可以设置flushCache=false,然后过了这个周期设置重新查询并缓存数据。 2-5、设置查询不提交缓存假设我们设置了全局缓存,但是在某个Mapper中的某个方法不需要查询之后,存储缓存,我们就需要给这个查询方法设置不设置缓存 2-5-1、修改Mapper中的查询方法我们先复制查询方法,并且给第一个设置useCache=false,这样第一个方法就不会周缓存(put/get) 2-5-2、测试如下可以看到: 2-6、设置关联缓存比如如下场景: 设置<cache-ref=“命名空间”/>就可以完成设置。 在未设置的情况下,虽然对员工表信息进行操作了,但是部门表的缓存依然可以命中。 局限性: 只能设置一个命名空间,无法设置多个,比如多个地方都引用当前Mapper,就无法指定了。 2-6-1、设置清除设置2-6-2、测试第三次查询就无法命中缓存了。 2-7、缓存属性的解析一下为缓存可以配置的属性,下面对相关属性进行解析
以上配置含义为:这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。 eviction清除策略:
默认的清除策略是 LRU。 flushInterval 属性间隔 size(引用数目) readOnly(只读) type(实现类) 2-8、二级缓存弊端:当进行关联查询的时候,如果一个Mapper,关联了多个Mapper,无法进行多个Mapper缓存的更新 三、使用redis实现二级缓存3-1、安装redis首先安装redis,可以参考之前的文章redis安装 3-2、使用maven添加mybatis-redis包
3-3、修改Mapper的cache类型添加 maven包之后,可以找到RedisCache类,复制完整限定名 将完整限定名粘贴到DeptMapper的Cache 中 3-4、添加redis.properties文件在resource下面添加redis.properties配置文件,并添加相关redis配置,如下 3-5、再次执行测试给RedisCache打断点,判断是否走了 可以看到已经进入断点,key的值如上 3-6、连接redis工具查看数据如上图,可以看到redis中的key为mapper的namespace,值又是一个map,Map中实际又是一级缓存的key和value |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:59:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |