Java Spring-Cache key配置注意事项介绍
为了提升项目的并发性能,考虑引入本地内存Cache,对:外部数据源访问、RestfulAPI调用、可重用的复杂计算等3种类型的函数处理结果进行缓存。目前采用的是springCache的@Cacheable注解方式,缓存具体实现选取的是GuavaCache。
具体缓存的配置此处不再介绍,重点对于key的配置进行说明:
1、基本形式
@Cacheable(value="cacheName",key"#id") publicResultDTOmethod(intid);
2、组合形式
@Cacheable(value="cacheName",key"T(String).valueOf(#name).concat('-').concat(#password))
publicResultDTOmethod(intname,Stringpassword);
3、对象形式
@Cacheable(value="cacheName",key"#user.id) publicResultDTOmethod(Useruser);
4、自定义key生成器
@Cacheable(value="gomeo2oCache",keyGenerator="keyGenerator") publicResultDTOmethod(Useruser);
注意:Spring默认的SimpleKeyGenerator是不会将函数名组合进key中的
如下:
@Component
publicclassCacheTestImplimplementsCacheTest{
@Cacheable("databaseCache")
publicLongtest1()
{return1L;}
@Cacheable("databaseCache")
publicLongtest2()
{return2L;}
@Cacheable("databaseCache")
publicLongtest3()
{return3L;}
@Cacheable("databaseCache")
publicStringtest4()
{return"4";}
}
我们期望输出:
1 2 3 4
实际却输出:
1 1 1 ClassCastException:java.lang.Longcannotbecasttojava.lang.String
此外,原子类型的数组,直接作为key使用也是不会生效的
为了解决上述2个问题,自定义了一个KeyGenerator如下:
classCacheKeyGeneratorimplementsKeyGenerator{
//customcachekey
publicstaticfinalintNO_PARAM_KEY=0;
publicstaticfinalintNULL_PARAM_KEY=53;
@Override
publicObjectgenerate(Objecttarget,Methodmethod,Object...params){
StringBuilderkey=newStringBuilder();
key.append(target.getClass().getSimpleName()).append(".").append(method.getName()).append(":");
if(params.length==0){
returnkey.append(NO_PARAM_KEY).toString();
}
for(Objectparam:params){
if(param==null){
log.warn("inputnullparamforSpringcache,usedefaultkey={}",NULL_PARAM_KEY);
key.append(NULL_PARAM_KEY);
}elseif(ClassUtils.isPrimitiveArray(param.getClass())){
intlength=Array.getLength(param);
for(inti=0;i
采用此方式后可以解决:多参数、原子类型数组、方法名识别等问题
总结
以上就是本文关于JavaSpring-Cachekey配置注意事项介绍的全部内容,感兴趣的朋友可以继续参阅:spark之Standalone模式部署配置详解、struts2开发流程及详细配置、Java之Spring注解配置bean实例代码解析等,如有不足之处,欢迎留言指出,小编会及时回复大家并修正,给广大编程爱好者提供更好的阅读体验,希望对大家有所帮助。在此也非常希望朋友们对本站多多支持!