当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-01 13:42:09 Java

一、前言在使用MyBatis、MybatisPlus等DAO层数据库访问框架时,往往会与一级缓存和二级缓存打交道。为了增强对缓存系统的整体控制,提高软件应用的响应速度,这里对三级缓存进行评测。缓存虽然可以提高系统性能,但也带来了脏数据的副作用。系统的缓存体系、缓存结构、缓存策略、缓存介质等都会对可能出现的脏数据产生影响。缓存是一把双刃剑。可以提高应用系统的效率,同时避免脏数据也是一个不小的工作量。尤其是同时使用不同级别的缓存时,数据异常的概率会迅速增加。2、一级缓存基于MyBatis技术的一级缓存默认开启,无法关闭。有两种类型:SESSION和STATEMENT。同一个会话在关闭前可以执行多条语句。当会话关闭时,一级缓存的生命周期结束。一种常见的情况是一个session执行一条sql语句,所以这两种类型区别不大。mybatis:configuration:#强制使用语句级缓存local-cache-scope:statement1,脏数据分析一级缓存可能出现的脏数据问题:当一个session调用两条以上相同的查询语句(包括查询条件)),第一次第二次调用后,会从本地缓存中取数据。同时,如果另一个session修改了相关数据,很明显从缓存中查询到的数据是脏数据。这种现象虽然存在,但考虑到session的时长是可控的,session结束后数据查询会恢复正常。在大多数情况下,实时数据行不能满足这个要求。2、避免脏数据,强制使用语句级缓存。在全局配置中强制使用statement-levelcache,可以避免系统缓存由于session没有及时关闭而导致的脏数据。会议及时结束。建议一个session只执行一条sql语句,sql语句执行完毕。及时关闭session后,当session关闭时,根据自动事务提交机制,自动释放session缓存。避免使用复杂的查询语句,将复杂的查询语句转化为多个简单的语句,在业务层通过事务聚合进行处理。事实上,随着数据量的快速膨胀,复杂的SQL语句对查询性能的负面影响越来越大。MybatisPlus连接查询方案甚至强烈建议开发者放弃传统的多表连接查询。3.二级缓存二级缓存是面向命名空间的,同一个Mapper文件下的所有DAO方法都会影响缓存。二级缓存默认是关闭的。正确使用二级缓存请参考MybatisPlus二级缓存解决方案一文。1.脏数据分析二级缓存产生脏数据的情况很多。典型场景如下:联合查询A表和B表联合查询时,将查询数据添加到Mapper所属namespace的缓存中。同时A表或B表更新了数据库数据。如果联合查询和更新表不在同一个命名空间中,则在缓存刷新时间结束之前无法接收到缓存更新信号。毫无疑问,有脏数据。2、避免脏数据,设置合理的缓存过期时间。二级缓存数据强制设置过期时间,保证缓存数据具有被动失效能力。避免使用传统的多表连接查询。强烈推荐使用MybatisPlus作为操作数据访问的基础技术,保证能够主动刷新正确的基于命名空间的缓存数据。新增的多表连接查询操作请参见MybatisPlus连接查询解决方案。4、三级缓存三级缓存是指业务层缓存,通常面向服务层,主要缓存不经常变化的数据或重复计算消耗CPU资源的数据。一般来说,三级缓存存在于二级缓存之上。业务层有很多缓存实现。常见的缓存实现有:Caffeine使用手册EhCache使用手册Redis使用手册业务层缓存独立可控,可以完全控制缓存的生命周期,相当灵活方便。1、使用场景业务缓存,顾名思义,就是需要对处理业务过程产生的数据进行缓存,比如一次重复计算,因为调用频率高,所以可以缓存结果。业务层调用DAO层获取数据。推荐使用二级缓存。业务层的主要目标是使用数据,缓存数据不是它的主要职责。5.接口缓存接口缓存面向整个接口,面向客户端,提高接口的响应性能。接口层可以直接调用数据访问层,也可以调用数据访问层(二级缓存),异或调用业务层,异或调用业务层(三级缓存),甚至可以自己缓存接口返回结果.如果你喜欢这篇文章,请点击??喜欢??支持它。有需要的可以微信dream4s联系我。相关源码在GitHub,视频讲解在B站,本文收集于博客世界。