注意:演示中的所有方法中的key是相同的,这样方便演示。
在方法中 @Cacheable用法演示:
@Cacheable(value = "cache",key = "1")
public String key1(){
return "1";
}
@Cacheable以键子对的形式进行缓存,用key属性去取value属性中的值,
value值为cache,cache存放key1()方法返回的" 1 ";
@Cacheable(value = "cache",key = "1")
public String key1(){
return "1";
}
@Cacheable(value = "cache",key = "1")
public String key2(){
return "2";
}
执行两个方法,当key为同一个时获取的值以第一个方法的值放入缓存为准,
如:先执行key1()方法,那么 key1()和key2()缓存中值都为1;
相反先执行key2()方法,那么 key1()和key2()缓存中值都为2;
由此得出结论 缓存中一个key对应一个值,并且不可修改。
实事上:@Cacheable在执行方法时会去判断key在缓存中是否有对应的值,
如果有值那么此方法就不执行,所以先执行key1()方法后,key在缓存中有对应的值,
则不会执行key2()方法而是直接从缓存中取值。
那么问题就来了,怎么修改或清除缓存呢
下面的注解就是答案
@CachePut用法演示:
@CachePut(value = "cache",key = "1")
public String key1(){
return "1";
}
@CachePut(value = "cache",key = "1")
public String key2(){
return "2";
}
结果是:key1()返回1,key2()返回2
事实上:@CachePut在执行方法时,不会去检查key在缓存中是否有值,而是直接执行方法,如果缓存有对应的值就更新值,没有就赋值。
使用@Cacheable和@CachePut也能实现清除缓存的功能,利用@CachePut会直接执行方法的特性
@Cacheable(value = "cache",key = "1")
public String key1(){
return "1";
}
@CachePut(value = "cache",key = "1")
public String key2(){
return "";
}
执行key1方法()在缓存中加入1的值,执行key2()方法更新key在缓存中对应的值为"",不过不推荐此方法
@CacheEvict清除缓存演示
@Cacheable(value = "cache",key = "1")
public String key1(){
return "1";
}
@CacheEvict(value = "sysConfig",key = "1")
public void removeKey(){
}
@Cacheable(value = "cache",key = "1")
public String key2(){
return "";
}
结果:1
3
如果去掉中间的removeKey()方法,结果都为1,原因就是@Cacheable有了key对应缓存的值后不会再执行相同key的方法。
@CacheEvict(value = "cache",allEntries = true)
public void removeKey(){
}
此方法为清空 cache缓存中所有的值