Spring Boot的Cache注解,常用的如下
一、@EnableCaching
项目中使用Cache的声明,在启动类上声明一次即可.
二、@Cacheable
注解Cacheable声明了方法的结果是可缓存的,如果缓存存在,则目标方法不会被调用,直接取出缓存。如果缓存不存在,则进入实际业务方法,将业务方法返回的结果缓存。
1、缓存的名称
注解Cacheable必须包括一个名称,也可以是一组名称。
@Cacheable("user") 声明一个user的缓存容器
@Cacheable(cacheNames="user")声明一个user的缓存容器
@Cacheable({"user","usercd"}) 声明两个(user、usercd)缓存容器
@Cacheable(cacheNames="user,usercd")声明两个(user、usercd)缓存容器
2、Key生成器
缓存的key非常重要,Spring使用KeyGenerator类来根据方法参数生成Key,有一下规则:
A、如果没有参数,则返回SimpleKey.EMPTY.比如构造系统的菜单树,因为系统只有唯一的一个菜单树,所以不用指定参数,Key值是SimpleKey.EMPTY
@Cacheable("sysmenu")
@Override
public List<SysPermission> findTopLevel() {
return sysPermissionRepository.findByLevel(0);
}
B、如果只有一个参数,这个参数就是key
@Cacheable("user")
@Override
public SysUser findById(String id) {
return sysUserRepository.findById(id).orElse(null);
}
C、如果有多个参数,则返回包含多个参数的SimpleKey
@Cacheable("userrole")
@Override
public SysUserRole findByUserIdAndRoleId(String userId, String roleId) {
return sysUserRoleRepository.findByUserIdAndRoleId(userId, roleId);
}
D、使用SpEL表达式来指定Key
@Cacheable(cacheNames="rolepermission", key="#role.id")
List<SysRolePermission> findByRole(SysRole role) {
3、条件缓存
A、使用条件表达式
@Cacheable(cacheNames="org", condition="#orgId>10000")
public Org findByOrgId(Long orgId) {...}
orgId大于10000的需要缓存
B、根据方法返回的结果来决定是否缓存,以下返回如果status为0则不缓存
@Cacheable(cacheNames="org",unless="#result.status==0")
public Org fingOrg(Long orgId) {...}
三、@CachePut
注解CachePut总是会执行方法体,并且使用返回的结果更新缓存,同Cacheable一样,支持condition、unless、key选项,也支持KeyGenerator.
@CachePut(cacheNames="category",key="#category.id")
@Override
public Category update(Category category) {
return categoryRepository.save(category);
}
四、@CacheEvict
注解CacheEvict用于删除缓存项或者清空缓存,CacheEvict可以指定多个缓存名来清空多个缓存。
1、清空缓存中key为某值的
@CacheEvict(cacheNames="categoryattr",key ="#id")
@Override
public CategoryAttr deleteById(String id) {
CategoryAttr current = this.findById(id);
if (null == current) {
throw new AppException("","删除的字典属性不存在!");
}
categoryAttrRepository.delete(current);
return current;
}
2、清空缓存中的所有项
@CacheEvict(cacheNames={"category,categoryattr"},allEntries=true)
@Override
public void deleteAll() {
categoryRepository.deleteAll();
}
五、@Caching
注解Caching,可以在标签中混合@Cacheable、@CachePut、@CacheEvict.
@Caching(
put= {
@CachePut(cacheNames="categoryattr",key="#categoryAttr.id"),
@CachePut(cacheNames="categoryattr",key="#categoryAttr.code")
}
)
@Override
public CategoryAttr update(CategoryAttr categoryAttr) {
return categoryAttrRepository.save(categoryAttr);
}
@Caching( evict = {
@CacheEvict(cacheNames="categoryattr",key ="#id"),
@CacheEvict(cacheNames="categoryattr",key ="#result.code"),
})
@Override
public CategoryAttr deleteById(String id) {
CategoryAttr current = this.findById(id);
if (null == current) {
throw new AppException("","删除的字典属性不存在!");
}
categoryAttrRepository.delete(current);
return current;
}
以及
@Caching(
put = {
@CachePut(cacheNames="user",key="#user.id"),
@CachePut(cacheNames="user",key="#user.code")
},
evict = {
@CacheEvict(cacheNames="userrole",key="#user.id"),
@CacheEvict(cacheNames="permission",key="#user.id"),
@CacheEvict(cacheNames="menu",key="#user.id")
}
)
@Override
public SysUser update(SysUser user) {
return sysUserRepository.save(user);
}
六、@CacheConfig
注解CacheConfig作用于类上,可以为此类的方法的缓存注解提供默认值,包括:
.缓存的默认名称
.缓存的KeyGenerator
七、集成cache
在配置文件中配置缓存的有效期,在开发测试时避免缓存长期有效而修改麻烦,在生产环境时避免滚雪球,越积越多。
spring.cache.type=redis
spring.cache.redis.time-to-live=60000 #10分钟有效