简介
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,在springBoot项目中使用。
对,你没有听错,就是加一个注解,就能实现缓存功能
SpringCache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实现不同的CacheManager:
如何使用
我们只需要导入spring-boot-start-web,这个依赖,就能够使用SpringCache缓存了,因为其在spring-web-mvc包的context依赖中,就包含了CacheManager
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
常用的注解
导入对应的依赖包后,我们需要在springBoot的启动类中,添加@EnableCaching注解,用来开启缓存注解功能
如果我们是只是使用SpringCache默认的的缓存产品,那些经过上述配置,就已经可以使用了。
@CachePut注解(添加指定缓存)
参数 value: 缓存的名称,每个缓存名称下面可以有多个key
参数 key:缓存的key
我们一般可以在新增的方法上增加,会将方法的返回值缓存起来
那么这个key,我们可以采用动态获取值:是采用Spring Expression Language(SPEL)
比如:
-
通过#来动态的获取参数中的值,key = "#id" 方法的形参名必须与之一致
-
也可以动态的获取返回值中的值,key = "#result.code"
我们可以动态的获取到当前查询用户的id,作为key储存到map中
@CachePut(value = "users",key = "#id")
@GetMapping("/user")
public User getById(Long id){
User user = userService.getById(id);
return user;
}
此时缓存中,就有一条数据了!
@CacheEvict(清除指定缓存)
在更新和删除的方法添加
参数 value: 缓存的名称,每个缓存名称下面可以有多个key
参数 key: 缓存的key
Spring Expression Language(SPEL)的多种意思相同的写法
下面的写法意思都是相同的
(SPEL)动态获取key的方法有很多种:
-
通过key = "#p0" 表示获取方法形参的第一个参数
-
key = "#root.args[0]"表示获取方法形参为0号下标的参数 这里下标是从0开始的
-
key = "#id" 直接通过#形参名 就可以动态的获取到这个形参
-
key = "#result.id" 直接从返回值中动态的获取值
@Cacheable
也是跟上面两个相同的用法。
问题
@Cacheable(value = "Msg",key = "#user.id")
但是如果只是这样,就会出现一个问题,当查询到的结果为null时,同样也会写入缓存,但这是我们并不想要的
所以可以加上一个参数 condition:条件,满足条件是才缓存数据
-
但是Cacheable (SPEL)的condition没有result这个参数
我们还可以使用unless代替,就是当满足这个条件的时候,就不缓存
@Cacheable(value = "Msg",key = "#user.id",unless= "#result == null")
表示不为空时,才添加缓存
总结
SpringCache默认的是根据map进行数据缓存的,其底层是实现ConcurrentMapCacheManager来缓存的
但是map又是基于内存的,如果服务重启后,缓存的数据就会丢失,所以我们想要更持久的保存缓存,还需要借助外界工具