Angular 6集成Spring Boot 2,Spring Security,JWT和CORS系列:七、Spring Boot的Cache注解

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分钟有效

猜你喜欢

转载自blog.csdn.net/lxhjh/article/details/84849628