前言

Spring Cache使用方法与Spring对事务管理的配置相似。SpringCache的核心就是对某个方法进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用键值对的方式存放到缓存中,当再次调用该方法使用相应的参数时,就会直接从缓存里面取出指定的结果进行返回。


常用注解

1、@EnableCaching:开启缓存支持

2、@Cacheable:使用这个注解的方法在执行后会缓存其返回结果(存储数据到缓存)

3、@CacheEvict:使用这个注解的方法在其执行前或执行后移除Spring Cache中的某些元素(删除缓存)


缓存使用

导入依赖

pom.xml

<!--redis 配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yml

spring:
redis:
database: 1 # 设置缓存存储库
host: localhost # redis服务地址
port: 6378 # redis服务端口号
password: # redis服务密码(未设置可注掉)
timeout: 100000ms # 连接超时时间(毫秒)

注解

@Cacheable

读取缓存数据,无数据则会更新缓存中数据。配置在方法或类上。

作用:本方法执行后,先去缓存看有没有数据,如果没有,从数据库中查找出来,给缓存中存一份,返回结果会将方法的返回值作为value进行缓存,下次本方法执行,在缓存未过期情况下,先在缓存中查找,有的话直接返回,没有的话从数据库查找。

注解参数:

参数 类型 解释 样例
value String[] 缓存位置名称(可以认为其为组的概念) @Cacheable(value = "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null")
cacheNames String[] 同上方value同理(具体使用请参考@CacheConfig) @Cacheable(cacheNames= "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null")
key String 缓存键,可使用“:”分割,分割后为组的概念,#后为方法上的参数名称,如果参数为对象,则#对象.get对应的属性值 名称,如果参数为对象,则#对象.get对应的属性值@Cacheable(value = "CREATE_NUMBER_RECORDING", key = "#infoDate+':'+#companyId+':'+#type+':'+#param1")
keyGenerator String 自定义生成key方式,与key()不可以共用。其值为spring注入的类,其类实现implements KeyGenerator 接口 @Cacheable(cacheNames = "ids_cache",keyGenerator = "setKeyGrenerator")
cacheManager String
cacheResolver String
condition String 使用SpEL表达式设定出发缓存的条件,在方法执行前生效
unless String 使用SpEL设置出发缓存的条件,方法执行完生效,所以条件中可以有方法执行后的value。函数返回值符合条件的排除掉、只缓存其余不符合条件的 @Cacheable(unless="#result == null") 排除值为null 的情况
sync boolean 是否同步,默认false

@CachePut

更新缓存中的值。配置到方法上。

作用:类似于更新操作,即每次不管缓存中有没有结果,都从数据库查找结果,并将结果更新到缓存,并返回结果。

注解参数:

参数 类型 解释 样例
value String[] 缓存位置名称(可以认为其为组的概念) @CachePut(value = "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null")
cacheNames String[] 同上方value同理(具体使用请参考@CacheConfig) @CachePut(cacheNames= "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null")
key String 缓存键,可使用“:”分割,分割后为组的概念,#后为方法上的参数名称,如果参数为对象,则#对象.get对应的属性值 名称,如果参数为对象,则#对象.get对应的属性值@CachePut(value = "CREATE_NUMBER_RECORDING", key = "#infoDate+':'+#companyId+':'+#type+':'+#param1")
keyGenerator String 自定义生成key方式,与key()不可以共用。其值为spring注入的类,其类实现implements KeyGenerator 接口 @CachePut(cacheNames = "ids_cache",keyGenerator = "setKeyGrenerator")
cacheManager String
cacheResolver String
condition String 使用SpEL表达式设定出发缓存的条件,在方法执行前生效
unless String 使用SpEL设置出发缓存的条件,方法执行完生效,所以条件中可以有方法执行后的value。函数返回值符合条件的排除掉、只缓存其余不符合条件的 @CachePut(unless="#result == null") 排除值为null 的情况

@CacheEvict

删除缓存数据,配置到方法上。

作用:用来清除用在本方法或者类上的缓存数据。

注解参数:

参数 类型 解释 样例
value String[] 缓存位置名称(可以认为其为组的概念) @CacheEvict(value = "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null")
cacheNames String[] 同上方value同理(具体使用请参考@CacheConfig) @CacheEvict(cacheNames= "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null")
key String 缓存键,可使用“:”分割,分割后为组的概念,#后为方法上的参数名称,如果参数为对象,则#对象.get对应的属性值 名称,如果参数为对象,则#对象.get对应的属性值@CacheEvict(value = "CREATE_NUMBER_RECORDING", key = "#infoDate+':'+#companyId+':'+#type+':'+#param1")
keyGenerator String 自定义生成key方式,与key()不可以共用。其值为spring注入的类,其类实现implements KeyGenerator 接口 @CacheEvict(cacheNames = "ids_cache",keyGenerator = "setKeyGrenerator")
cacheManager String
cacheResolver String
condition String 使用SpEL表达式设定出发缓存的条件,在方法执行前生效
allEntries boolean allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
beforeInvocation boolean 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

@Caching

同时指定多个Spring Cache相关的注解,配置到方法或者类上。

其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

注解参数:

参数 类型 解释 样例
cacheable Cacheable[] 配置多个@Cacheable @CacheEvict(value = "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null")
put CachePut[] 配置多个CachePut
evict CacheEvict[] 配置多个CacheEvict

缓存使用示例

Application启动类

在启动类上添加注解 @EnableCaching 开启缓存支持

@SpringBootApplication
@EnableCaching
public class REDISApplication {
public static void main(String[] args) {
SpringApplication.run(REDISApplication.class, args);
}
}

实现类中具体代码

@CacheConfig

场景:在方法前添加 @CacheConfig 注解可以指定整个类中的 RedisCache 缓存的名称(也就是前缀)

注意:cacheNames 等同于 value

@Service
@CacheConfig(cacheNames = "user")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

@Cacheable

场景:查询操作时,添加数据到缓存中

注意:若此处的类上使用了 @CacheConfig 注解设置了 cacheNames 或 value的值,则存入缓存的 key 为 “user:id”

@Override
@Cacheable(key = "#id")
//@@Cacheable(value = "user", key = "#id")
public User getUserById(Long id) {
return userMapper.selectById(id);
}

@CacheEvict

场景:在执行根据id删除操作时,删除全部key为”user:id”的缓存

@Override
@CacheEvict(value = "user", key = "#id")
public void removeUser(Long id) {
userMapper.deleteById(id);
}

@CachePut

场景:在进行保存操作时,无论缓存中是否有相同key的数据,都会直接保存缓存

注意:在正常业务中保存操作会直接返回一个 boolean 值的结果,但是在执行保存缓存操作时,如果直接返回一个 boolean 值的结果会导致数据存储丢失,需要返回一个 user 的对象才是把整个保存的 user 对象进行存储

@Override
@CachePut(value = "user", key = "#user.id")
public User saveUser(User user) {
userMapper.insert(user);
return user;
}

结语

在学习过程中还有看到自定义注解的使用,暂未搞懂,故不做记录。