Spring 全家桶之 Spring Boot 2.6.4( Ⅰ )- Caching(Part B)(中)

简介: Spring 全家桶之 Spring Boot 2.6.4( Ⅰ )- Caching(Part B)

接着点击左下侧的Resume Program,跳到下一个断点既lookup()

image.png

这个key就是查询传入的参数,在前面生成的

image.png


image.png

回到ConcurrentMapCache中继续Debug

image.png

进入到put()方法中,此时已经调用了目标方法,并且拿到了返回值

image.png

更换查询的数据,在TeslaMapperImpl的getTeslaById()方法上打断点,重新Debug

image.png

跳转至下一个断点就来到put()方法,该方法将查询到的结果存储到CurrentMap中

image.png

@Cacheable运行流程总结:

  1. 方法运行之前,先查询Cache,按照注解中定义的CacheNames指定的名称来获取缓存,第一次获取缓存如果没有Cache组件会自动创建
  2. 去Cache中查询缓存的内容,使用一个key,这个key默认就是目标方法传递的参数,key是按照策略生成的,默认使用SimpleKeyGenerator生成,默认的策略为:
  • 如果没有参数,key = new SimpleKeyGenerator()
  • 如果有一个参数,key就是参数的值
  • 如果有多个参数,key = new SimpleKey(params)
  1. 如果查询不到缓存就去调用目标方法,使用生成的key来存储到Map中
  2. 将目标方法返回的结果放进缓存中

也就是说@Cacheable标注的方法执行之前都会先去缓存中查询有没有这个数据,默认按照目标方法传递的参数查询,如果没有就运行方法并将结果缓存,如果不是第一次运行就直接存缓存中获取数据,核心就是CacheManager按照cacheNames得到Cache

@Cacheable的属性

cacheNames/value

@Cacheable的cacheNames或者value属性指的是缓存组件的名字,将返回结果放在哪个缓存中,是一个数组,也就是说可以放在多个缓存中

key

key是用来存取缓存的,缓存是存储在Map中的,key非常重要,key可以使用SpEL表达式来指定也可自定义KeyGenerator来指定,也可以使用默认的SimpleKeyGenerator生成

使用SpELl表达式指定key为getTeslaById(1166057547)

@Cacheable(cacheNames = {"tesla"}, key = "#root.methodName+'(' + #id + ')'")
复制代码

重新启动该应用,浏览器中执行查询操作

image.png

自定义KeyGenerator,实现KeyGenerator接口,并将该类注册到容器中

@Configuration
public class LilithCacheKeyGenerator {
    @Bean(lilithKeyGenerator)
    public KeyGenerator keyGenerator(){
        return (target, method, params) -> method.getName() + "[" + Arrays.asList(params).toString() + "]";
    }
}
复制代码

在TeslaServiceImpl类上的getTeslaById()方法上使用自定义的KeyGenerator,需要注意的是key和keyGenerator的使用只能二选一

@Cacheable(cacheNames = {"tesla"}, keyGenerator = "lilithKeyGenerator")
复制代码

在自定义的KeyGenerator类上打断点,开启Debug模式,在浏览器上执行查询操作

image.png

首先会来到getCache()方法

image.png

点击Run to Cursor到下一个断点就来到自定义的keyGenerator方法中

image.png

再到下一个断点,此时key的形式即为自定义的形式getTeslaById[1166057546]

image.png

condition

condition条件,只有condition指定的条件为true时才会缓存结果

@Cacheable(cacheNames = {"tesla"}, keyGenerator = "lilithKeyGenerator", condition = "#id==1166057546")
复制代码

这里指定的condition条件是只有id=1166057546才会缓存,否则不缓存

重启应用,在浏览器多次查询id=1166057546,控制台打印的日志中只会执行一次SQL

image.png

多次查询id=id=1166057547,会执行多次,查询结果不会被缓存,因为此时condition条件为true

image.png

unless

unless属性指定条件为true时,不会缓存返回结果

@Cacheable(cacheNames = {"tesla"}, keyGenerator = "lilithKeyGenerator", unless = "#id==1166057546")
复制代码

这里指定的unless是当查询1166057546既条件为true时,返回结果不会被缓存

重启应用,在浏览器执行查询操作,此时查询1166057546时,结果没有被缓存,unlesss条件为true

image.png

1166057547 如果查询的数据不是1166057546,查询结果会被缓存,因为unless条件为false

image.png

异步模式下不支持unless

@CachePut注解

既调用方法,有更新缓存数据,在修改了数据库的某个数据,同时更新缓存 在TeslaService增加updateTesla()方法,并在TeslaServiceImpl中实现

void updateTesla(Tesla tesla);
复制代码
@Override
@CachePut(cacheNames = {"tesla"}, key = "#tesla.id")
public void updateTesla(Tesla tesla) {
    log.info(tesla.getId() + "被更新了");
    teslaMapper.update(tesla);
}
复制代码

TeslaController中增加方法

@GetMapping("/tesla")
public void update(Tesla tesla){
    teslaService.updateTesla(tesla);
}
复制代码

去除unless或者condition条件

@Cacheable(cacheNames = {"tesla"}, keyGenerator = "lilithKeyGenerator"
复制代码

重启应用,现在浏览器中查询1166057546,执行一次之后,返回结果被缓存

image.png


相关文章
|
2月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
371 2
|
3月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
2021 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
498 0
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
8月前
|
前端开发 Java Maven
Spring 和 Spring Boot 之间的比较
本文对比了标准Spring框架与Spring Boot的区别,重点分析两者在模块使用(如MVC、Security)上的差异。Spring提供全面的Java开发基础设施支持,包含依赖注入和多种开箱即用的模块;而Spring Boot作为Spring的扩展,通过自动配置、嵌入式服务器等功能简化开发流程。文章还探讨了两者的Maven依赖、Mvc配置、模板引擎配置、启动方式及打包部署等方面的异同,展示了Spring Boot如何通过减少样板代码和配置提升开发效率。总结指出,Spring Boot是Spring的增强版,使应用开发、测试与部署更加便捷高效。
1124 11
|
9月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
455 0
|
9月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
337 0