当前位置: 首页 > news >正文

Spring Cache框架的介绍和使用

Spring Cache

spring cache是一个框架,实现类基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。

spring cache只是提供了一层抽象,底层可以切换不同的cache实现,具体就是通过cacheManager接口来统一不同的缓存技术。CacheManager是spring提供的各种缓存技术抽象接口。

针对不同的缓存技术需要实现不同的cacheManager

CacheManager描述
EhCacheCacheManager使用EhCache作为缓存技术
GuavaCacheManager使用Google的GuavaCache作为缓存技术
RedisCacheManager使用Redis作为缓存技术

注解

在SpringCache中提供了很多缓存操作的注解,常见的是以下的几个:

注解说明
@EnableCaching开启缓存注解功能
@Cacheable在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用**@EnableCaching**开启缓存支持即可。使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。

框架使用步骤:

导入pom文件

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

配置Redis的key的序列化器

// com.atguigu.spzx.cache.config;
@Configuration
public class RedisConfig {@Beanpublic CacheManager cacheManager(LettuceConnectionFactory connectionFactory) {//定义序列化器GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()//过期时间600秒.entryTtl(Duration.ofSeconds(600))// 配置序列化.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer));RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();return cacheManager;}}

3、在启动类上添加**@EnableCaching**注解

4、方法上添加**@Cacheable**注解

@Cacheable

1.作用:在方法执行前,spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据,若没有数据,调用方法并将方法返回值放到缓存中。

2.value:缓存的名称,每个缓存名称下面可以有多个key

3.key:缓存的key 支持spring的表达式语言SPEL语法

Spring 表达式语言(SpEL)

是一种在 Spring 框架中使用的表达式语言,它提供了一种在运行时对对象图进行查询和操作的强大方式。SpEL 的语法相对简洁且易于使用,其主要特点包括:

  1. 引用对象属性:使用 #{} 将属性名包裹起来,如 #{user.name} 表示引用了 user 对象的 name 属性。
  2. 引用集合元素:使用 [] 语法引用集合中的元素,如 #{userList[0]} 表示引用了 userList 集合的第一个元素。
  3. 调用方法:可以使用 . 语法调用对象的方法,如 #{user.getName()} 表示调用了 user 对象的 getName() 方法。
  4. 运算符:支持常见的数学运算符(+, -, *, /)以及逻辑运算符(and, or, not)等。
  5. 条件运算:支持三元条件运算符 condition ? trueValue : falseValue
  6. 正则表达式匹配:使用 matches 关键字进行正则表达式匹配。
  7. 集合选择:通过 . 语法对集合进行筛选,如 #{userList.?[age > 18]} 表示从 userList 中选择年龄大于 18 的用户。
  8. 投影运算:使用 . 语法对集合进行投影操作,如 #{userList.![name]} 表示从 userList 中提取所有用户的 name 属性。
  9. Ternary 操作符:类似 Java 中的 ?: 操作符,用于条件判断。
  10. 安全导航运算符:使用 ?. 来避免 NPE(NullPointerException),如果属性为空,则不会抛出异常。

这些是 SpEL 中的一些主要语法特点,它提供了灵活而强大的功能,可以在 Spring 中的诸多场景下使用,如注解、配置文件、XML 配置等。 SpEL 的语法规则相对简洁清晰,使得开发者能够轻松地在 Spring 应用中进行对象图的操作和查询。

//首先根据key查询redis中的值并返回  如果redis中没有值,则返回当前方法返回的对象
@Override
@Cacheable(value = "userCache",key = "#userId")
public User findById(Long userId){User user = new User();user.setAge(18);return user;
}

@CachePut

作用:将方法返回值,放入缓存

value:缓存的名称,每个缓存名称下面可以有很多key

key: 缓存的key 支持spring的表达式语言SPEL语法

当前UserController的save方法是用来保存用户信息的,我们希望在该用户信息保存到数据库的同事,也在缓存中缓存一份数据,我们可以在save方法上加上注解@CachePut,用法如下:

@CachePut(value = "userCache",key = "#user.userName")
public User saveUser(User user){return user
}

key的写法如下:

#user.id: #user指的是方法形参的名称,id指的是user的id属性,也就是使用user的id属性作为key

#user.userName: #user指的是方法形参的名称,name指的是user的name属性,也就是使用user的name属性作为key

#result.id: #result代表方法返回值,该表达式代表以返回对象的id属性作为key

#result.userName:#result代表方法返回值,该表达式代表以返回对象的name属性作为key

@CacheEvit

作用:清理指定缓存

value:缓存的名称,每个缓存名称下面可以有多个key

key:缓存的key —>支持spring的表达式语言SPEL语法

当我们在删除数据库user表的数据的时候,我们需要删除缓存中对应的数据,此时就可以使用@CahceEvit注解,具体使用方式如下:

@CacheEvit(value = "userCache", key = "#userId")
public void deleteById(Long userId){log.info("用户数据删除成功....")
}
http://www.lryc.cn/news/319111.html

相关文章:

  • perl 用 XML::Parser 解析 XML文件,访问哈希
  • MATLAB中的矩阵和数组,它们之间有什么区别?
  • python爬虫实战——抖音
  • Day1-力扣刷题学习打卡
  • C语言的位操作与位字段
  • 应用实战|从头开始开发记账本1:如何获取BaaS服务
  • el-form v-for循环列表的表单如何校验
  • 笔记:《NCT全国青少年编程能力等级测试教程Python语言编程三级》
  • 地平线旭日x3派部署yolov5--全流程
  • 【Golang星辰图】Go语言云计算SDK全攻略:深入Go云存储SDK实践
  • 深入理解TCP:序列号、确认号和自动ACK的艺术
  • 家电工厂5G智能制造数字孪生可视化平台,推进家电工业数字化转型
  • ctf_show笔记篇(web入门---代码审计)
  • c语言的字符串函数详解
  • HarmonyOS NEXT应用开发—折叠屏音乐播放器方案
  • Java项目:55 springboot基于SpringBoot的在线视频教育平台的设计与实现015
  • 说下你对TCP以及TCP三次握手四次挥手的理解?
  • wsl-oracle 安装 omlutils
  • Python类属性和对象属性大揭秘!
  • 北斗卫星在桥隧坡安全监测领域的应用及前景展望
  • 如何通过堡垒机JumpServer使用VisualCode 连接服务器进行开发
  • 【Linux】进程优先级
  • Fair Data Exchange:区块链实现的原子式公平数据交换
  • 详解优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器
  • Vue3+TS+Vite 找不到模块“@/components/xxx/xxx”或其相应的类型声明
  • Vue3-响应式基础:单文件和组合式文件
  • DVWA-File Upload文件上传
  • python之word操作
  • Linux下新增有root权限的用户
  • RPC通信原理(一)