spring框架提供了@Cacheable和@CacheEvict的注解用于增加缓存和清除缓存
Cacheable使用
这个注解是加在类方法上的,value接收的是返回值
Cache 接口下 Spring 提供了各种 xxxCache 的实现,比如:RedisCache、EhCache、ConcurrentMapCache。
缓存流程
把缓存注解加到方法上,第一次执行,会缓存到数据库上,当再次执行时,spring会检查这个方法是不是已经调用过了,如果已经调用就直接加载缓存返回。这里有个注意点,比如你缓存了用户数据,当你用户信息修改后,如果没有清空对应的缓存,那么调用此方法你的用户数据还是旧数据,大部分情况下需要组合使用。
缓存使用
1、在SpringApplication主启动类上加上启用缓存注解@EnableCaching
2、在你想要的方法上使用Cacheable注解
@Cacheable(value = "user_info", key = "#openId")
public User getByOpenId(String openId) {
user = userRepo.findFirstByOpenId(openId);
return user;
}
属性介绍
- value:缓存的名字
- key:缓存的key唯一标识
- keyGenerator :key生成器
- cacheManager :缓存管理器
- condition :可以设置指定条件下才执行缓存操作
- sync :异步模式
CacheEvict使用
属性
- key:缓存的key,默认为空。缓存多了无法定位,所以最好还是加上且最好是唯一识别
- value:缓存名称,不能为空(例如我要存一个User类,缓存名称设置为user_info,那么user_info就是一个复杂对象的值,里面有着User类的各个实例数据)
- condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL表达式
- allEntries:true表示清除value中的全部缓存,默认为false
SpEL是什么?就是类似value="#{user2.getUsername()}"这样用#{XX}就属于SpEL表达式。
清除某单一key缓存
@CacheEvict(value = "user_info", key = "#openId")
public User getByOpenId(String openId) {
user = userRepo.findFirstByOpenId(openId);
return user;
}
这里allEntries为默认的false,清除缓存就是单一缓存,需要提供对应的Key-value缓存
清除所有缓存
@CacheEvict(value = "user_info",allEntries=true)
public User getByOpenId(String openId) {
user = userRepo.findFirstByOpenId(openId);
return user;
}
这里就属于清除所有value是user_info的缓存,所以此时key你写不写都可以,写了也不会生效。
清除缓存总结
这里的key-value的常规理解不同,常规是根据key来执行删除,value值也是大部分都是各不相同的。在缓存中,key是各不相同,但是同一个业务场景中value的名字是一样的都是user_info。如果在Redis中我们存有user_info, article_info,他们根据openId、articleId作为key来找到对应的value。很多情况下,清除缓存不可能一个个根据openId去清除,用整体清除。