@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
@Cacheable(value="cache_loyalty", key="#p0")
public List
@Cacheable(value="cache_loyalty", key="#la.id")
public List
@Cacheable(value="cache_loyalty", key="#p0.id")
public List
-- condition属性指定条件如下:指定东西属性为偶数是才会触发缓存
@Cacheable(value={"cache_loyalty"}, key="#la.id", condition="#la.age%2 == 0 ")
redis 截图:
@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