SpringBoot怎么整合Spring Cache实现Redis缓存
来源:亿速云
时间:2024-04-10 11:45:37 363浏览 收藏
一分耕耘,一分收获!既然打开了这篇文章《SpringBoot怎么整合Spring Cache实现Redis缓存》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!
1、简介
Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cache 提供了一层抽象,底层可以切换不同的cache实现。
具体就是通过 CacheManager 接口来统一不同的缓存技术。
CacheManager 是 Spring 提供的各种缓存技术抽象接口,这是默认的缓存技术,是缓存在Map中的,这也说明当服务挂掉的时候,缓存的数据就没了。
针对不同的缓存技术需要实现不同的 CacheManager
CacheManager | 描述 |
---|---|
EhCacheCacheManager | 使用 EhCache 作为缓存技术 |
GuavaCacheManager | 使用 Google 的 GuavaCache 作为缓存技术 |
RedisCacheManager | 使用 Redis 作为缓存技术 |
2、常用注解
在 Spring Boot 项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用 @EnableCaching
开启缓存支持即可。例如,使用 Redis 作为缓存技术,只需要导入 Spring data Redis 的 maven 坐标即可。常用的注解有如下几个:
注解 | 说明 |
---|---|
@EnableCaching | 开启缓存注解功能 |
@Cacheable | 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
2.1、@EnableCaching
该注解的主要功能就是开启缓存注解的功能,让 Spring Cache 中的其他注解生效。使用方式也十分简单,直接将其加在项目的启动类上方即可。
@Slf4j @SpringBootApplication @EnableCaching public class CacheDemoApplication { public static void main(String[] args) { SpringApplication.run(CacheDemoApplication.class, args); log.info("项目启动成功..."); } }
2.2、@Cacheable
@Cacheable
注解主要是在方法执行前 先查看缓存中是否有数据。如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中。
注解中的参数传递主要使用的是**SpEL(Spring Expression Language)**对数据进行获取传递,这有点类似于JSP中的EL表达式,常用方式如下几种:
“#p0”:获取参数列表中的第一个参数。其中的“#p”为固定写法,0为下标,代表第一个;
“#root.args[0]”:获取方法中的第一个参数。其中0为下标,代表第一个。
“#user.id”:获取参数 user 的 id 属性。注意的是这里的 user 必须要和参数列表中的参数名一致
“#result.id”:获取返回值中的 id 属性。
来自Spring Cache源码:Spring Expression Language (SpEL) expression used for making the method
在@Cacheable
注解中有几种常用的属性可进行需求性设置:
value:缓存的名称,每个缓存名称下面可以有多个 key
key:缓存的key。
condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效
unless:条件判断,满足条件时则不对数据进行缓存,Redis中可使用该参数替代condition
/** * @description 通过id获取用户信息 * @author xBaozi * @date 14:23 2022/7/3 **/ @Cacheable(value = "userCache", key = "#id", unless = "#result == null") @GetMapping("/{id}") public User getById(@PathVariable Long id) { User user = userService.getById(id); return user; }
2.3、@CachePut
@CachPut
注解主要是将方法的返回值放到缓存中。这里同样是使用SpEL获取数据,常用的属性如下:
value:缓存的名称,每个缓存名称下面可以有多个 key
key:缓存的key。
condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效
unless:条件判断,满足条件时则不对数据进行缓存,Redis中可使用该参数替代condition
/** * @description 新增用户信息并返回保存的信息 * @author xBaozi * @date 14:38 2022/7/3 **/ @CachePut(value = "userCache", key = "#user.id") @PostMapping public User save(User user) { userService.save(user); return user; }
2.4、@CacheEvict
@CacheeEvict
主要是将一条或多条数据从缓存中删除,同样使用SpEL获取数据,常用的属性如下:
value:缓存的名称,每个缓存名称下面可以有多个 key
key:缓存的key。
condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效
unless:条件判断,满足条件时则不对数据进行缓存,Redis中可使用该参数替代condition
/** * @description 更新用户信息 * @author xBaozi * @date 14:41 2022/7/3 **/ @CacheEvict(value = "userCache", key = "#result.id") @PutMapping public User update(User user) { userService.updateById(user); return user; }
3、使用Redis当作缓存产品
因为 Spring 默认的缓存技术无法持久化保存缓存数据,即服务挂了缓存也挂了,因此就需要使用Redis进行操作(其实也是因为学习了Redis)
前面的SpringBoot整合Redis缓存验证码里面有记录着一些Redis的基本操作。
3.1、坐标导入
导入 maven 坐标:spring-boot-starter-data-redis、spring-boot-starter-cache
<!--Spring Data Redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--Spring Cache--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
3.2、yml配置
spring:
redis:
host: localhost
port: 6379
password: 123456
database: 0
cache:
redis:
time-to-live: 1800000 # 设置缓存有效期
3.3、开启注解功能
在启动类 com/itheima/CacheDemoApplication.java
上加入 @EnableCaching 注解,开启缓存注解功能
@Slf4j @SpringBootApplication @ServletComponentScan @EnableCaching public class ReggieApplication { public static void main(String[] args) { SpringApplication.run(ReggieApplication.class, args); log.info("springBoot项目启动成功……"); } }
3.4、使用@Cacheable
这里提一下有个坑就是使用的缓存时,返回值必须实现 Serializable 序列化接口,否则将会报错。
这是因为在 NoSql 数据库中,并没有与我们 Java 基本类型对应的数据结构,所以在往 NoSql 数据库中存储时,我们就必须将对象进行序列化,同时在网络传输中我们要注意到两个应用中 javabean 的 serialVersionUID 要保持一致,不然就不能正常的进行反序列化。
/** * @description 新增套餐信息 * @author xBaozi * @date 17:55 2022/5/13 * @param setmealDto 需要新增套餐的数据 **/ @CacheEvict(value = "setmealCache",allEntries = true) @PostMapping public Result<String> save(@RequestBody SetmealDto setmealDto) { log.info("套餐信息为{}", setmealDto); setmealService.saveWithDish(setmealDto); return Result.success("套餐" + setmealDto.getName() + "新增成功"); }
3.5、使用@CacheEvict
这里用到了一个新属性allEntries,其是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了 allEntries 为 true 时,Spring Cache将忽略指定的 key。有的时候我们需要 Cache 一下清除所有的元素,这比一个一个清除元素更有效率。
/** * @description 更新套餐信息并更新其关联的菜品 * @author xBaozi * @date 11:28 2022/5/14 * @param setmealDto 需要更新的套餐信息 **/ @CacheEvict(value = "setmealCache",allEntries = true) @PutMapping public Result<String> updateWithDish(@RequestBody SetmealDto setmealDto) { log.info(setmealDto.toString()); setmealService.updateWithDish(setmealDto); return Result.success("套餐修改成功"); }
4、测试
代码编写完成之后,重启工程,然后访问后台管理系统,对套餐数据进行新增以及删除,而后观察Redis中的数据发现写的代码是能正常跑到!成功!
到这里,我们也就讲完了《SpringBoot怎么整合Spring Cache实现Redis缓存》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于redis,SpringBoot,springcache的知识点!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
342 收藏
-
361 收藏
-
159 收藏
-
164 收藏
-
221 收藏
-
156 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习