应用系统缓存体系深入研究(Java版)

本文详细介绍了MyBatis和MyBatisPlus中的一级、二级和三级缓存机制,以及如何处理可能出现的脏数据问题。一级缓存默认开启,会话关闭时生命周期结束;二级缓存面向namespace,脏数据可能出现在跨namespace的更新操作中。为避免脏数据,可以设置合理的缓存过期时间,避免复杂查询。三级缓存位于业务层,用于存储不常变化的数据。接口缓存则可以提升接口响应性能。建议使用MyBatisPlus提供的缓存解决方案来优化数据访问和缓存管理。

一、序言

在使用MyBatis、MybatisPlus等DAO层数据库访问框架式,常常会与一级缓存、二级缓存打交道,为了增强对缓存体系的整体把控力,提 广东干部培训 http://gd.ganxun.cn/ 高软件应用响应速度,这里对三级缓存一次梳理。

缓存固然能够提高系统性能,与此同时也带来了脏数据的副作用,系统的缓存体系、缓存结构、缓存策略、缓存介质等对可能出现的脏数据产生影响。

缓存是一把双刃剑,既能够提高应用系统的效率,同时避免脏数据发生也是不小的工作量。特别是不同的层次的缓存同时使用时,出现数据异常的概率快速提高。

二、一级缓存

以MyBatis技术为基础的一级缓存默认是开启的且无法关闭,有SESSIONSTATEMENT两种类型。同一会话在关闭前可以执行多个语句,会话在关闭时,一级缓存生命周期结束。常见的情况是一个会话执行一条SQL语句,因此这两种类型区别不大。

mybatis:  configuration:  # 强制使用语句级缓存    local-cache-scope: statement
1、脏数据分析

一级缓存可能出现的脏数据问题:当一次会话调用两次以上相同的查询语句(包含查询条件)时,第二次以后调用会从本地缓存取数据,与此同时如果另一个会话将有关的数据修改,显而易见从缓存查询的数据是脏数据。

尽管这种现象是存在的,考虑到会话的持续时间可控,会话结束后数据查询即恢复正常,大多数情况下数据的实时行达不到此要求。

2、回避脏数据
  • 强制使用语句级缓存

在全局配置中强制使用语句级缓存,防止系统因会话未及时关闭而产生的缓存脏数据

  • 会话及时关闭

推荐一个会话仅执行一条SQL语句,并且SQL语句执行完毕后及时关闭会话,会话关闭时,根据事务自动提交机制,本次会话缓存自动释放。

  • 避免使用复杂查询语句

将复杂查询语句转变成多条简单语句,在业务层通过事务汇总处理。事实上,随着数据量的急剧膨胀,复杂SQL语句对查询性能的负面影响越来越大。MybatisPlus连接查询解决方案甚至强烈推荐开发者弃用传统方式上的多表连接查询。

三、二级缓存

二级缓存面向namespace,同一个 Mapper 文件下所有的 DAO 方法都能对缓存施加影响。二级缓存默认是关闭状态。

正确使用二级缓存,请参考MybatisPlus二级缓存解决方案一文。

1、脏数据分析

二级缓存产生脏数据的情况有很多,典型的场景如下:

  • 联合查询

当表 A 和表 B 联合查询时,将查询数据添加至所在 Mapper 所属namespace的缓存中,与此同时,表 A 或者表 B 对数据库数据做了更新,联合查询与更新表如果不在同一个namespace下,在缓存刷新时间结束前是收不到更新缓存的信号的,毫无疑问是存在脏数据的。

2、回避脏数据
  • 设置合理的缓存过期时间

二级缓存数据强制设置过期时间,保证缓存数据拥有被动失效的能力。

  • 避免使用传统意义上的多表连接查询

强烈推荐使用MybatisPlus作为基础技术操作数据访问,保证能够正确的基于namespace为单位的缓存数据能够主动刷新。新型多表连接查询操作,请查看MybatisPlus连接查询解决方案。

四、三级缓存

三级缓存指业务层缓存,通常面向service层,主要缓存不常变化或者重复计算耗费CPU资源的数据。一般来讲,三级缓存存在于二级缓存之上。业务层缓存实现非常多,常见有缓存实现有:

  • Caffeine使用手册
  • EhCache使用手册
  • Redis使用手册

业务层缓存自主可控强,能够全方位掌控缓存的生命周期,相当灵活方便。

1、使用场景

业务缓存,顾名思义是因处理业务流程而产生的数据缓存需要,比如说一项重复的计算,因为调用频率较高,因此可以对结果予以缓存。

业务层调用DAO层获取数据建议使用二级缓存完成,业务层的主要目标是使用数据,缓存数据并不是其主要职责。

五、接口缓存

接口缓存面向整个接口,面向用户端提高接口的响应性能。接口层可以直接调用数据访问层,或者调用数据访问层(二级缓存),异或调用业务层,异或调用业务层(三级缓存),甚至对接口返回结果本身进行缓存。


六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,详细介绍了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程的理论与Matlab代码实现过程。文档还涵盖了PINN物理信息神经网络在微分方程求解、主动噪声控制、天线分析、电动汽车调度、储能优化等多个工程与科研领域的应用案例,并提供了丰富的Matlab/Simulink仿真资源和技术支持方向,体现了其在多学科交叉仿真与优化中的综合性价值。; 适合人群:具备一定Matlab编程基础,从事机器人控制、自动化、智能制造、电力系统或相关工程领域研究的科研人员、研究生及工程师。; 使用场景及目标:①掌握六自由度机械臂的运动学与动力学建模方法;②学习人工神经网络在复杂非线性系统控制中的应用;③借助Matlab实现动力学方程推导与仿真验证;④拓展至路径规划、优化调度、信号处理等相关课题的研究与复现。; 阅读建议:建议按目录顺序系统学习,重点关注机械臂建模与神经网络控制部分的代码实现,结合提供的网盘资源进行实践操作,并参考文中列举的优化算法与仿真方法拓展自身研究思路。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值