缓存注解Cacheable、CachePut、CacheEvict的使用

583 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

配置

依赖:

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

在启动类或者配置类使用@EnableCaching注解。 在配置类中设置缓存过期时间,根据缓存的使用情况来设置过期时间。

@Configuration
@EnableCaching
public class RedisConfig {
    /**
     * 缓存管理器
     * 默认缓存过期时间:150分钟
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(
                Duration.ofMinutes(150)).serializeKeysWith(RedisSerializationContext.SerializationPair
                .fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext
                .SerializationPair.fromSerializer(createJacksonRedisSerializer())).disableCachingNullValues();
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
        return new RedisCacheManager(redisCacheWriter, config);
    }


    private Jackson2JsonRedisSerializer<Object> createJacksonRedisSerializer() {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        return jackson2JsonRedisSerializer;
    }

}

@Cacheable

@Cacheable注解用于存储及读取缓存,当使用的方法返回的结果不为空时,会把当结果存储到缓存,结果为空则不存储。

@Cacheable的结构如下:

image.png

@Cacheable属性介绍

属性类型描述
valueString[]缓存名称
cacheNamesString[]缓存组件的名字, value和cacheNames二选一
keyStringSpEL表达式,自定义缓存key
keyGeneratorString自动生成缓存key,key 和 keyGenerator 二选一使用
cacheManagerString可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存
conditionStringSpEL表达式,指定条件下才缓存,即为true时才缓存
unlessStringSpEL表达式,如果结果为true则返回值不缓存
syncboolean是否使用异步

示例:

@Cacheable(cacheNames = "getInfo", key = "#user.username")
public Object getInfo(User user) {

}

@Cacheable(cacheNames = "getUser", key = "#p0")
public Object getUser(String username) {

}


@Cacheable("users")
public Object getList(String params) {

}

@CachePut

@CachePut注解仅存储缓存,它会把方法的返回值存储到缓存,其不会去查询缓存,这是与@Cacheable不同的地方,被@CachePut注解的方法始终会被执行。

其结构和@Cacheable一样,如下:

image.png

@CacheEvict

@CacheEvict注解仅删除缓存,其可根据条件对缓存进行删除。 其结构如下:

image.png

@CacheEvict属性介绍

属性类型描述
allEntriesboolean是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存
beforeInvocationboolean是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存

自定义缓存key

表达式描述
#root.args传递给缓存方法的参数,形式为数组
#root.caches该方法执行时所对应的缓存,形式为数组
#root.target目标对象
#root.method缓存方法
#root.methodName缓存方法的名字

示例:

@Cacheable(cacheNames = "users", key = "#root.methodName")
public Object getUsers() {
    
}

总结

注解描述
Cacheable存储及读取缓存。会先查询缓存,当缓存为空,被注解的方法才会被执行
CachePut仅存储缓存。不查询缓存,被注解的方法始终会被执行。
CacheEvict仅删除缓存,被注解方法会被执行