码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【RuoYi-Vue-Plus】学习笔记 32 - Redisson(七)集成 Spring Cache 缓存分析


    文章目录

      • 前言
      • 参考目录
      • 框架集成
        • 1、Maven
        • 2、配置文件缓存配置
        • 3、Redis配置类
        • 4、缓存测试类
        • 5、测试
        • 5.1、`@Cacheable`
        • 5.2、`@CachePut`
        • 5.3、`@CacheEvict`
      • 源码分析
        • 1、Redisson 整合 Spring Cache 核心 API
        • 2、缓存自动装配
        • 2.1、`CacheAutoConfiguration`
        • 2.2、`RedissonCacheStatisticsAutoConfiguration `
        • 2.3、`CacheMetricsAutoConfiguration`
        • 3、`@EnableCaching`
        • 3.1、`CachingConfigurationSelector`
        • 3.1.1、自动代理注册器 `AutoProxyRegistrar`
        • 3.1.2*、代理缓存配置 `ProxyCachingConfiguration`
        • 3.1.2.1、`PointcutAdvisor`:`BeanFactoryCacheOperationSourceAdvisor`
        • 3.1.2.2、`CacheOperationSource`
        • 3.1.2.3、`Advice`(`MethodInterceptor`):`CacheInterceptor`
        • 4、缓存以及获取值(@Cacheable)
        • 4.1、第一次请求,没有缓存值
        • 4.1.1、从缓存中查找是否有值
        • 4.1.2、缓存
        • 4.2、第二次请求,有缓存值

    前言

    先说句题外话,框架发布了 V4.3.0 公测版本 了,有兴趣的朋友可以去尝鲜。

    最近没有更新不是在摆烂,而是在梳理 AOP 的相关内容,因为这篇博客的内容属实有点难搞,所以就去找了很多书籍、博客和视频去恶补相关的内容(其中有些很好的我会在下面的参考目录里面一一列举出来)。

    这篇博客可能更多的是偏向于个人学习的笔记,所以如果有错漏的地方烦请指正。

    参考目录

    • Redisson 官方文档 - 14.2. Spring Cache整合
      提供了最简单的 Demo 演示如何整合 Spring Cache。
    • Spring 官方文档 - 8. Cache Abstraction
      遇事不决,官方文档。
    • 木子旭 - java-sping-cache 专栏
      关于 Spring Cache 的专栏,写得很全面。
    • 叔牙 - Spring cache原理详解
      关于 Spring Cache 的博客,写得挺好的。
    • 代码重工 - 第三章Spring AOP
      一个博客网站,里面还有别的一些实用的知识总结。
    • Spring 5 高级编程(第5版)
    • Spring揭秘(第2版)
      两本书也是查看了关于 Spring AOP 的相关内容。

    Redisson 缓存是整合了 Spring Cache,而 Spring Cache 的实现又是基于 Spring AOP 的,因此个人觉得对于这一部分的学习需要夯实基础才能更好地学习和理解。

    框架集成

    1、Maven

    总工程 pom.xml,Redisson 版本 V3.17.5
    总工程 pom.xml
    公共模块 pom.xml
    公共模块 pom.xml

    2、配置文件缓存配置

    配置文件 application.yml
    配置文件 application.yml

    3、Redis配置类

    com.ruoyi.framework.config.RedisConfig
    Redis配置类 RedisConfig
    其中,注解 @EnableCaching 开启缓存功能。

    Spring Cache 配置 RedisConfig#cacheManager
    Redis配置类 Spring Cache 配置
    (红线告警无视即可,在 RedissonAutoConfiguration 自动装配时已经在容器中注入了 RedissonClient)

    4、缓存测试类

    com.ruoyi.demo.controller.RedisCacheController
    缓存测试类 RedisCacheController
    该类提供了三个主要缓存注解的演示 Demo 以及说明:

    注解解析使用注意事项
    @Cacheable表示这个方法有了缓存的功能,方法的返回值会被缓存下来。下一次调用该方法前,会去检查是否缓存中已经有值:如果有就直接返回,不调用方法;如果没有,就调用方法,然后把结果缓存起来。一般用在查询方法上缓存注解严禁与其他筛选数据功能一起使用。例如: 数据权限注解会造成 缓存击穿 与 数据不一致 问题
    @CachePut会把方法的返回值put到缓存里面缓存起来,供其它地方使用通常用在新增方法上
    @CacheEvict清空指定缓存一般用在更新或者删除的方法上

    5、测试

    5.1、@Cacheable

    请求参数
    Redis保存结果

    5.2、@CachePut

    请求参数
    Redis保存结果
    修改后 @Cacheable 接口请求结果:
    请求结果

    5.3、@CacheEvict

    请求参数
    Redis保存结果
    test 已被删除。

    源码分析

    在开始之前,我想先声明一下,最好是对于 Spring AOP 有一定程度的了解,知道什么是 Pointcut,PointcutAdvisor,Advice,MethodInterceptor 等。除此之外,了解 Spring AOP 的基本实现原理,否则看起来可能会比较费解(本文不会太详细去阐述相关概念,可以通过参考目录或者其他资料自行补充理解)。

    1、Redisson 整合 Spring Cache 核心 API

    先放一张简单的脑图,只是列举出了 Spring Cache 比较核心的 API:
    Spring Cache 核心 API

    2、缓存自动装配

    先来简单看下自动装配。

    在配置文件 application.yml 中,打开 debug 配置:

    debug: true
    
    • 1

    启动服务观察控制台输出。

    2.1、CacheAutoConfiguration

    在这里插入图片描述
    在这里插入图片描述
    这里的 CacheManager 正是 RedisConfig 中配置的缓存管理器:
    在这里插入图片描述

    2.2、RedissonCacheStatisticsAutoConfiguration

    在这里插入图片描述
    在这里插入图片描述

    2.3、CacheMetricsAutoConfiguration

    在这里插入图片描述
    在这里插入图片描述
    这里引入了 CacheMetricsRegistrarConfiguration:
    在这里插入图片描述
    该方法会绑定缓存管理器到注册表中:
    在这里插入图片描述
    通过 RedissonSpringCacheManager 获取 Cache:
    在这里插入图片描述
    RedissonSpringCacheManager#createMapCache
    在这里插入图片描述
    RedissonSpringCacheManager#getMapCache
    在这里插入图片描述
    Redisson#getMapCache
    在这里插入图片描述
    最终得到的结果:
    在这里插入图片描述

    3、@EnableCaching

    首先从入口开始入手,参考 叔牙 - Spring cache原理详解 中的时序图:

    Spring Cache时序图

    org.springframework.cache.annotation.EnableCaching
    @EnableCaching
    要了解一个 EnableXX 注解干了啥,就看它导入 @Import 了什么内容。

    3.1、CachingConfigurationSelector

    org.springframework.cache.annotation.CachingConfigurationSelector
    CachingConfigurationSelector
    在这里插入图片描述

    3.1.1、自动代理注册器 AutoProxyRegistrar

    org.springframework.context.annotation.AutoProxyRegistrar#registerBeanDefinitions
    在这里插入图片描述
    org.springframework.aop.config.AopConfigUtils#registerOrEscalateApcAsRequired
    在这里插入图片描述

    3.1.2*、代理缓存配置 ProxyCachingConfiguration

    org.springframework.cache.annotation.ProxyCachingConfiguration
    ProxyCachingConfiguration
    最重要的配置类之一,这里面配置了缓存相关的内容,也是基于 AOP 相关的实现。下面一个个来说明。

    3.1.2.1、PointcutAdvisor:BeanFactoryCacheOperationSourceAdvisor

    在这里插入图片描述
    首先来看下 UML 图:
    在这里插入图片描述
    PointcutAdvisor 相当于 Pointcut 与Advice 的连接器( PointcutAdvisor 继承自 Advisor,Advisor 是 Advice 的容器接口,他们是一对一关联的)。

    3.1.2.2、CacheOperationSource

    在这里插入图片描述
    该方法 new AnnotationCacheOperationSource()。
    在这里插入图片描述
    初始化了 Spring 缓存解析器 SpringCacheAnnotationParser:
    在这里插入图片描述
    在方法 SpringCacheAnnotationParser#parseCacheAnnotations 进行缓存注解的解析操作:
    在这里插入图片描述

    3.1.2.3、Advice(MethodInterceptor):CacheInterceptor

    在这里插入图片描述
    熟悉 Spring AOP 的朋友都知道,Spring AOP 中提供了不同类型的 Advice,但是通过查看源码 AdvisorAdapter 可知,所有 Advice 底层实现都是用MethodInterceptor 来进行实现的。

    查看 CacheInterceptor 的 UML 图:
    在这里插入图片描述
    AspectJ 实现是通过拦截器反射(invoke)来实现的,因此在该类中也必然有 invoke 方法:
    在这里插入图片描述
    CacheInterceptor 的能力来自于父类 CacheAspectSupport:
    在这里插入图片描述
    稍后断点再进行说明。

    4、缓存以及获取值(@Cacheable)

    4.1、第一次请求,没有缓存值

    CacheAspectSupport#execute
    在这里插入图片描述

    4.1.1、从缓存中查找是否有值

    CacheAspectSupport#execute
    在这里插入图片描述
    CacheAspectSupport#findCachedItem
    在这里插入图片描述
    CacheAspectSupport#findInCaches
    在这里插入图片描述
    AbstractCacheInvoker#doGet
    在这里插入图片描述
    RedissonCache#get
    在这里插入图片描述
    第一次请求为空,回到主方法 CacheAspectSupport#execute,将结果进行缓存。

    4.1.2、缓存

    在这里插入图片描述
    CachePutRequest#apply
    在这里插入图片描述
    AbstractCacheInvoker#doPut
    在这里插入图片描述
    缓存完成回到主方法,返回最终执行结果:
    在这里插入图片描述

    4.2、第二次请求,有缓存值

    RedissonCache#get
    在这里插入图片描述
    获取到缓存值,直接返回到前端,不再进入请求方法体内。

  • 相关阅读:
    无涯教程-JavaScript - OCT2BIN函数
    【读书笔记《凤凰架构》- 构架可靠的大型分布式系统.周志明】
    紧跟新时代消费趋势,荟语酒店以创新思维打造“幸福感”消费新体验
    【C++】C++11新特性之右值引用与移动语义
    手写数字识别——算法
    【开源三方库】Easyui:基于OpenAtom OpenHarmony ArkUI深度定制的组件框架
    编程实例:洗车店会员管理系统软件一卡多项目管理编程
    Folium笔记: Popup
    ROS2使用colcon build编译的工程运行出错,cmake编译的没有问题。
    宝塔:如何开启面板ssl并更新过期ssl
  • 原文地址:https://blog.csdn.net/Michelle_Zhong/article/details/126291961
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号