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时输出的结果一致


相关文章
|
2天前
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
1月前
|
监控 Java 数据库连接
详解Spring Batch:在Spring Boot中实现高效批处理
详解Spring Batch:在Spring Boot中实现高效批处理
158 12
|
1月前
|
安全 Java 测试技术
详解Spring Profiles:在Spring Boot中实现环境配置管理
详解Spring Profiles:在Spring Boot中实现环境配置管理
82 10
|
26天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
89 5
|
2月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
75 19
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
109 2
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
247 1
|
2月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
35 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
41 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
2月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
234 2