SpringBoot使用缓存注解@Cacheable

  • @Cacheable:定义缓存,用于触发缓存
  • @CachePut:定义更新缓存,触发缓存更新
  • @CacheEvict:定义清除缓存,触发缓存清除

 @Cacheable 的使用方法

/**
	 * 通过查询指定code 获取字典值text
	 * @param code
	 * @param key
     * @param langType
	 * @return
	 */

	@Override
	@Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code+':'+#key+':'+#langType")
	public String queryDictTextFromLanguageByKey(String code, String key, String langType) {
		log.debug("无缓存dictText的时候调用这里!");
		return sysDictMapper.queryDictTextFromLanguageByKey(code, key,langType);
	}

这里我们介绍一下缓存的简单结构:

        在缓存中,每个这样的缓存名称的名下都会存在着多个缓存条目,这些缓存条目对应在使用不同的参数调用当前方法时生成的缓存,所有一个缓存名称并不是一个缓存,而是一系列缓存。

        另一个key用于指定当前方法的缓存保存时的键的组合方式,默认的情况下使用所有的参数组合而成,这样可以有效区分不同参数的缓存。当然我们也可以手动指定,指定的方法是使用SPEL表达式。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例。

   @Cacheable(value="cache_loyalty", key="#id")

   public List find(String id) ...

   @Cacheable(value="cache_loyalty", key="#p0")

   public List find(String id)...

   @Cacheable(value="cache_loyalty", key="#la.id")

   public List find(LoyaltyApplier la)...

   @Cacheable(value="cache_loyalty", key="#p0.id")

   public List find(LoyaltyApplier la) ...

-- condition属性指定条件如下:指定东西属性为偶数是才会触发缓存

 @Cacheable(value={"cache_loyalty"}, key="#la.id", condition="#la.age%2 == 0 ") 
 

redis 截图:

SpringBoot使用缓存注解@Cacheable_第1张图片

 @Cacheable 源码解析:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
    // 用于指定缓存名称,与cacheNames()方法效果一致
    @AliasFor("cacheNames")
    String[] value() default {};
    // 用于指定缓存名称,与value()方法效果一致
    @AliasFor("value")
    String[] cacheNames() default {};
    // 用于使用SPEL手动指定缓存键的组合方式,默认情况使用所有的参数来组合成键,除非自定义了keyGenerator。
    // 使用SPEL表达式可以根据上下文环境来获取到指定的数据:
    // #root.method:用于获取当前方法的Method实例
    // #root.target:用于获取当前方法的target实例
    // #root.caches:用于获取当前方法关联的缓存
    // #root.methodName:用于获取当前方法的名称
    // #root.targetClass:用于获取目标类类型
    // #root.args[1]:获取当前方法的第二个参数,等同于:#p1和#a1和#argumentName
    String key() default "";
    // 自定义键生成器,定义了该方法之后,上面的key方法自动失效,这个键生成器是:
    // org.springframework.cache.interceptor.KeyGenerator,这是一个函数式接口,
    // 只有一个generate方法,我们可以通过自定义的逻辑来实现自定义的key生成策略。
    String keyGenerator() default "";
    // 用于设置自定义的cacheManager(缓存管理器),可以自动生成一个cacheResolver
    // (缓存解析器),这一下面的cacheResolver()方法设置互斥
    String cacheManager() default "";
    // 用于设置一个自定义的缓存解析器
    String cacheResolver() default "";
    // 用于设置执行缓存的条件,如果条件不满足,方法返回的结果就不会被缓存,默认无条件全部缓存。
    // 同样使用SPEL来定义条件,可以使用的获取方式同key方法。
    String condition() default "";
    // 这个用于禁止缓存功能,如果设置的条件满足,就不执行缓存结果,与上面的condition不同之处在于,
    // 该方法执行在当前方法调用结束,结果出来之后,因此,它除了可以使用上面condition所能使用的SPEL
    // 表达式之外,还可以使用#result来获取方法的执行结果,亦即可以根据结果的不同来决定是否缓存。
    String unless() default "";
    // 设置是否对多个针对同一key执行缓存加载的操作的线程进行同步,默认不同步。这个功能需要明确确定所
    // 使用的缓存工具支持该功能,否则不要滥用。
    boolean sync() default false;
}

参考链接:

https://www.jianshu.com/p/6db623355e11

https://blog.csdn.net/weixin_37828719/article/details/100264704

https://www.cnblogs.com/yihuihui/p/14964660.html

你可能感兴趣的:(java)