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

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

接着修改1166057546,/tesla?id=1166057546&name=TeslaRoadster&price=1600000&vehicleType=roaster&factoryId=3,修改也是成功的

image.png

再次查询1166057546

image.png

此时发现查询到的结果还是之前的结果,并不是更新后的结果,这是因为更新没有返回数据,方法中都是void,所以缓存中的数据没有变化

依次修改TeslaService接口、TeslaServiceImpl类以及TeslaController中的update方法,使方法返回更新后的数据

Tesla updateTesla(Tesla tesla);
复制代码
@Override
@Cacheable(cacheNames = {"tesla"}, keyGenerator = "lilithKeyGenerator"
public Tesla updateTesla(Tesla tesla) {
    log.info(tesla.getId() + "被更新了");
    return tesla;
}
复制代码
@GetMapping("/tesla")
public Tesla update(Tesla tesla){
    Tesla updateTesla = teslaService.updateTesla(tesla);
    return updateTesla;
}
复制代码

重新启动应用,在浏览器中查询116605754

image.png

更新116605754

image.png

再次查询116605754

image.png

控制台返回的仍是第一次查询时保存的数据

这一次是因为查询结果存储时使用的key是id,更新结果存储时使用的key是employee对象,统一key 再次测试,都是用id作为key,只需要修改TeslaServiceImpl中的updateTesla()

@CachePut(cacheNames = {"tesla"}, key = "#tesla.id")
复制代码

重启应用,再次查询

image.png

进行更新操作

image.png

再次查询

image.png

更新后再次查询时返回的数据是更新后的数据

使用@CachePut需要注意的事项:

  • 更新后要将更新的数据返回
  • 要将查询时保存的key和更新时设置的key保持一致,这样才会更新缓存

@CacheEvict

该注解的作用是用来清除缓存

分别在TeslaService接口、TeslaServiceImpl实现类以及TeslaController中增加方法

void deleteTeslaCache(Integer id);
复制代码
@CacheEvict(cacheNames = {"tesla"}, key = "#id")
public void deleteTeslaCache(Integer id){
    log.info("清除" + id + "的缓存");
}
复制代码
@GetMapping("/tesla/delcache/{id}")
public void deleteCache(@PathVariable("id") Integer id){
    teslaService.deleteTeslaCache(id);
}
复制代码

image.png

/tesla/delcache/1166057546

image.png

allEntries属性

该属性是会删除缓存中所有的数据,默认是清除指定cacheNames的缓存

beforeInvocation属性

该属性是指在方法执行前删除缓存还是方法执行后删除缓存,为布尔值类型,默认为false既在方法执行后删除缓存

@CacheEvict(cacheNames = {"tesla"}, key = "#id")
public void deleteTeslaCache(Integer id){
    log.info("清除" + id + "的缓存");
    // 增加异常代码
    int i = 1 / 0;
}
复制代码

重启

image.png

image.png

再次查询,没有调用SQL语句,方法由于出现异常,导致未能执行清除缓存

@CacheEvict(cacheNames = {"tesla"}, key = "#id", beforeInvocation = true)
复制代码

image.pngimage.png


再次查询还是执行了SQL语句,说明在方法执行前就已经将缓存删除,方法中的异常不会对清除缓存造成影响

@Caching

该注解用来指定多个复杂规则

image.png

分别在TeslaController、TeslaService、TeslaServiceImpl、TeslaMapper以及TeslaMapper.xml中增加代码及SQL语句,按照name来查询

@GetMapping("/tesla/name/{name}")
public Tesla findByName(@PathVariable("name") String name){
    return teslaService.getTeslaByName(name);
}
复制代码
Tesla getTeslaByName(String name);
复制代码
public Tesla getTeslaByName(String name){
    log.info("根据" + name + "查询特斯拉");
    return teslaMapper.selectOneByName(name);
}
复制代码
Tesla selectOneByName(String name);
复制代码
<select id="selectOneByName" resultType="tesla">
    SELECT <include refid="Base_Columns_List" />
    FROM tesla
    WHERE name = #{name}
</select>
复制代码

在TeslaServiceImpl的getTeslaByName()方法上增加@Caching注解,该注解中配置了一个@Cacheable注解和一个@CachePut注解

@Caching(
        cacheable = {
            @Cacheable(cacheNames = "tesla", key = "#name")
        },
        put = {
            @CachePut(cacheNames = "tesla", key = "#result.id"),
        }
)
复制代码

重新应用,首先按照name查询 /tesla/name/TeslaRoadster,控制台打印出SQL

image.png

接着按照id查询 /tesla/1166057546,此时已经有缓存了,没有执行SQL语句

image.png

再次按照name查询,控制台打印出SQL语句

image.png

再用name查询,还是会执行SQL,因为getTeslaByName()方法有@CachePut注解,这个注解就表示一定要执行方法

CacheConfig

@CacheConfig注解标注在类上,可以定义一些公共的缓存配置,比如cacheNames、key等

image.png

在TeslaServiceImpl类上增加@CacheConfig,配置cacheNames

@CacheConfig(cacheNames = "tesla")
复制代码

将getTeslaByName()方法上@Caching标注的cacheNames属性删除

@Caching(
        cacheable = {
            @Cacheable(key = "#name")
        },
        put = {
            @CachePut(key = "#result.id"),
        }
)
复制代码

重新启动应用,首先按照name查询/tesla/name/TeslaRoadster,控制台打印出SQL

image.png

接着按照id查询

image.png

再次按照name查询

image.png

控制台输出结果与单独配置cacheNames时输出的结果一致


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

热门文章

最新文章

下一篇
oss云网关配置