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实例代码解析等,如有不足之处,欢迎留言指出,小编会及时回复大家并修正,给广大编程爱好者提供更好的阅读体验,希望对大家有所帮助。在此也非常希望朋友们对本站多多支持!