SpringCache框架常用注解

1.Cacheable使用缓存

  • @Cacheable注解

    • 标记在一个方法上,也可以标记在一个类上
    • 缓存标注对象的返回结果,标注在方法上缓存该方法的返回值,标注在类上缓存该类所有的方法返回值
    • value:缓存名称,可以有多个
    • key:缓存的key规则,可以使用SpringEL表达式,默认是方法参数组合
    • condition:缓存条件,使用SpringEL编写,返回true才缓存
    @RequestMapping("selectById")
    @Cacheable(value = {"product"}, key = "#root.methodName +':'+ #id")
    public Product selectById(Integer id){
    	return this.productService.selectById(id);
    }
    
  • SpringEL表达式

    • methodName:当前被调用的方法名
      • #root.methodName
    • args:当前被调用的方法的参数列表
      • #root.args[0]
    • result:方法执行后的返回值
      • #result

2.CacheManager配置过期时间

  • 修改redis缓存序列化和配置manager过期时间
// 配置文件 
/**
  * RedisCacheManager1小时过期
  * @param redisConnectionFactory
  * @return
  */
@Bean
@Primary
public RedisCacheManager cacheManager1Hour(RedisConnectionFactory redisConnectionFactory) {
    RedisCacheConfiguration config = instanceConfig(3600L);
    return RedisCacheManager.builder(redisConnectionFactory)
        .cacheDefaults(config)
        .transactionAware().build();
}

/**
  * RedisCacheManager1天过期
  * @param redisConnectionFactory
  * @return
  */
@Bean
public RedisCacheManager cacheManager1Day(RedisConnectionFactory redisConnectionFactory) {
    RedisCacheConfiguration config = instanceConfig(3600 * 24L);
    return RedisCacheManager.builder(redisConnectionFactory)
        .cacheDefaults(config)
        .transactionAware().build();
}

/**
  * 序列化配置
  * @param ttl
  * @return
  */
private RedisCacheConfiguration instanceConfig(Long ttl) {
    Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    objectMapper.registerModule(new JavaTimeModule());
    // 去掉各种@JsonSerialize注解的解析
    objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
    // 只针对非空的值进行序列化
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    // 将类型序列化到属性json字符串中
    objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    return RedisCacheConfiguration.defaultCacheConfig()
        .entryTtl(Duration.ofSeconds(ttl))
        .disableCachingNullValues()
        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
}

// 使用
@Cacheable(value = {"product"}, key = "#root.methodName +':'+ #id", cacheManager = "cacheManager1Day")

3.KeyGenerator自定义缓存Key

  • 配置

    @Bean
    public KeyGenerator springCacheKeyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                return o.getClass().getSimpleName() + "_"
                    + method.getName() + "_"
                    + StringUtils.arrayToDelimitedString(objects, "_");
            }
        };
    }
    
  • 使用

    @Cacheable(value = {"product"}, keyGenerator = "springCacheKeyGenerator")
    

4.CachePut更新使用缓存

  • CachePut注解
    • 根据方法的请求参数对其结果进行缓存,每次都会触发真实方法的调用
    • value:缓存名称,可以有多个
    • key:缓存的key规则,可以用springEL表达式,默认是方法参数组合
    • condition:缓存条件,使用springEL编写,返回true才缓存
// 使用场景:尽量保持修改和查询使用同一个key
@RequestMapping("update")
@CachePut(value = {"product"}, key = "#product.id")
public Product update(@RequestBody Product product){
    int i = this.productService.update(product);
    if (i > 0){
        return product;
    }
    return null;
}

@RequestMapping("selectById")
@Cacheable(value = {"product"}, key = "#id")
public Product selectById(Integer id){
    return this.productService.selectById(id);
}

5.CacheEvict删除缓存

  • CacheEvict注解

    • 从缓存中移除相应数据,触发缓存删除的操作
    • value:缓存名称,可以有多个
    • key:缓存的key规则,可以用springEL表达式,默认是方法参数组合
    • beforeInvocation = false
      • 缓存的清除是否在方法之前执行,默认缓存清除操作是在方法执行之后执行
      • 如果出现异常缓存就不会清除
    • beforeInvocation = true
      • 代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除
    @CacheEvict(value = {"product"}, key = "#id")
    

6.Caching多注解组合使用缓存

  • Caching注解
    • 组合多个Cache注解使用
    • 允许在同一方法上使用多个嵌套的@Cacheable、@CachePut、@CacheEvict注解
@Caching(
    cacheable = {
    	@Cacheable(value = {"product"}, key = "#id")
    },
    put = {
    	@CachePut(value = {"product"}, key = "#id")
    }
)
posted @ 2021-07-21 18:26  Gen2021  阅读(373)  评论(0编辑  收藏  举报