总述

目前的spring boot项目使用到了redis缓存,再次记录一下关于缓存的注解
主要用到的是这四个

import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.cache.annotation.CachePut;

@CacheConfig,@Cacheable,@CachePut,@CacheEvict,@Caching

@CacheConfig

提供一种在类级别共享公共缓存相关设置的机制。

{@code @CacheConfig} 
provides a mechanism for sharing common cache-related settings at the class level.

这个注解写在类上,主要作用是抽取缓存方法的公共属性

主要属性有:

  • 缓存名称:cacheNames,对应value或者cacheNames
  • 缓存管理器名称:cacheManager,对应cacheManager
  • KeyGenerator的名称集合:keyGenerator,对应keyGenerator

示例如下

@CacheConfig(cacheNames = CachingConfig.CacheName.CACHE_NAME,
		cacheManager = CachingConfig.CacheManagerName.REDIS_CACHE_MANAGER,
		keyGenerator = CachingConfig.KeyGeneratorNames.CONFIG_KEY_GENERATOR)
@Component
@Slf4j
public class RedisAccessCacheImpl implements RemoteAccessCache {
}

@Cacheable

放置在方法上,表示可以将结果放入缓存

Annotation indicating that the result of invoking a method 
(or all methods  in a class) can be cached.

主要属性有:

  • 键名:key,可以为空,可使用 SpEL 表达式编写,如果为空,则按照方法的所有参数进行组合
  • 缓存条件:condition,可以为空,使用 SpEL 编写,返回 true 或 false,为 true 才进行缓存
  • 缓存名称:value,可集体抽取为@CacheConfig的cacheNames,或者单独写,必填

示例如下

@Cacheable(key = "'getObsToken_'+ #name")
public TokenVO getToken(String name) {
	return getObsToken.getToken(name);
}

@CachePut

与@Cacheable基本相同
区别是

  • @CachePut:这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中。
  • @Cacheable:当重复使用相同参数调用方法时,方法本身不会被调用,而是直接从缓存中找到结果并返回。
  • 也就是说@Cacheable一次缓存,不再更新。@CachePut次次缓存,一直更新

@CacheEvict

放置在方法上,可以按照条件清除缓存

Annotation indicating that a method (or all methods on a class) triggers a 
{@link org.springframework.cache.Cache#evict(Object) cache evict} operation

主要属性有:

  • 键名:key,可以为空,可使用 SpEL 表达式编写,如果为空,则按照方法的所有参数进行组合
  • 缓存条件:condition,可以为空,使用 SpEL 编写,返回 true 或 false,为 true 才进行缓存
  • 缓存名称:value,可集体抽取为@CacheConfig的cacheNames,或者单独写,必填
  • 是否清空所有缓存:allEntries,缺省为 false,指定为 true
  • 是否在方法执行前就清空:beforeInvocation,缺省为 false,指定为 true

示例如下

	@CacheEvict(key = "'findByBatchId_'+ #detailId + '_' + #batchId ")
	public void updateByBatchId(Long detailId, String batchId) {
		batchHistoryRepository.updateByBatchId(detailId,batchId);
	}

@Caching

为自定义的组合缓存规则

Group annotation for multiple cache annotations (of different or the same type).

主要属性有:

  • @Cacheable的组合:cacheable,默认{}
  • @CachePut的组合:put,默认{}
  • @CacheEvict的组合:evict,默认{}

示例如下

	@Caching(evict = { 
		@CacheEvict(key = "'findByDocInfo_'+ #docVO.bussNo + '_'+ #docVO.category"),
		@CacheEvict(key = "'selectByDocDetailId_'+ #docVO.id"),
		@CacheEvict(key = "'findByDocDetailId_'+ #docVO.id ")
		})
    public void updateFileSort(DocVO docVO, DocDetailVO detailVO) {
        impDocFileRepository.updateFileSort(detailVO.getId(),detailVO.getSort());
    }
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐