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

一、序言

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

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

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

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

二、一级缓存

以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资源的数据。一般来讲,三级缓存存在于二级缓存之上。业务层缓存实现非常多,常见有缓存实现有:

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

1、使用场景

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

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

五、接口缓存

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

Original: https://www.cnblogs.com/javazhishitupu/p/15953773.html
Author: Java知识图谱
Title: 应用系统缓存体系深入研究(Java版)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574882/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java8 Stream流式编程,极大解放你的生产力!

    java8自带常用的函数式接口 Predicate<t> boolean test(T t)</t> 传入一个参数返回boolean值 Consumer&l…

    Java 2023年5月29日
    064
  • Nginx log 日志分割

    Nginx日志不处理的话,会一直追加,文件会变得很大 方法1:给日志文件名加上日期 推荐 log_format access-upstream ‘$time_iso8601|$re…

    Java 2023年6月14日
    072
  • C语言-内存函数的实现(二)之memmove

    C语言中的内存函数有如下这些 memcpy memmove memcmp memset 下面看看memmove函数 memmove 为什么会需要memmove函数? int mai…

    Java 2023年6月10日
    077
  • Spring中@within与@target的一些区别

    背景 模拟项目例子 看看使用 @within和 @target的区别 @within @target @target 看起来跟合理一点 通知方法中注解参数的值为什么是不一样的 想用…

    Java 2023年6月8日
    077
  • JAVA基础-接口和抽象类

    个人经验,抽象类工作中很少见。 不过鉴于一直对这些概念很模糊,所以学习记录一下。 一、什么是抽象类? 简单来说,不管是抽象类还是抽象方法都必须用 abstract 关键字进行 声明…

    Java 2023年6月5日
    076
  • SpringBoot 整合WebSocket 简单实战案例

    转载:https://blog.csdn.net/qq_35387940/article/details/93483678 Original: https://www.cnblog…

    Java 2023年5月30日
    043
  • Java工程师的核心竞争力

    Java工程师的核心竞争力软实力业务理解,对自己所处的业务有比较深刻的理解。主动去熟悉一个领域内的业务知识,这其实对后续需求的开发更有利。明确自己所做的事情对整个业务的影响,清楚当…

    Java 2023年5月29日
    063
  • 云图说丨DDoS防护解决方案:DDoS大流量攻击防得住

    摘要:华为云安全服务打造DDoS防护解决方案,助您防患于未然,筑牢业务安全防线。 本文分享自华为云社区《【云图说】第255期 DDoS防护解决方案:DDoS大流量攻击防得住》,作者…

    Java 2023年6月15日
    064
  • 多图流带你玩转CODING DevOps

    首先介绍一下什么是CODING DevOps,这里套用官网介绍 依托业界领先的敏捷项目管理理念与 DevOps 体系方法论,我们将这些优秀的理念与工具融入至产品中,打通了研发过程中…

    Java 2023年6月14日
    091
  • java网络编程

    网络编程 TCP 编程 使用tcp 之前先建立TCP连接,形成传输数据的通道,点对点的通信是可靠的。2,两个进程:客户端 服务端3,在连接中进行大量数据的传输4,传输完毕需要释放建…

    Java 2023年6月8日
    069
  • 宝塔nginx无法安装wordfence怎么解决?使用chattr i命令

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/ytkah/p/15543431.htmlAuthor:…

    Java 2023年5月30日
    067
  • Java基础知识整理

    MVC Model: 常用javaBean实现,通过各种类对数据库进行获取,并封装在对象中。 View: 常用JSP实现,通过Jsp页面来展示我们从数据库中获取的数据。 Contr…

    Java 2023年5月29日
    069
  • 保姆教程系列二、Nacos实现注册中心

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 上篇我们介绍到 保姆教程系列一、Linux搭建Nacos 注册中心原理 一、环境准备 Java版本:1.8+ (L…

    Java 2023年6月5日
    095
  • springAOP和AspectJ有关系吗?如何使用springAOP面向切面编程

    不知道大家有没有这样的感觉,平时经常说aop,但是对aop中的一些概念还是模糊,总感觉很飘渺,今天来梳理下关于aop的知识。 一、概念 我们知道现在开发都是spring,讲的最多的…

    Java 2023年6月9日
    091
  • java_反射详解

    1.类对象概念: 所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。 2.获取类对象的三种方式: public stat…

    Java 2023年6月5日
    066
  • 《软技能——代码之外的生存指南》十步学习法

    1.了解全局 2.确定范围 3.定义目标 4.寻找资源 5.创建学习计划 6.筛选资源 7.开始学习,浅尝辄止 8.动手操作,边玩边学 9.全面掌握,学以致用 10.乐为人师,融会…

    Java 2023年6月7日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球