主题
公司在缓存用的还是比较简单的,可能不同于其他公司需要redis,memcache等等缓存.公司使用的是ehcache(怎么感觉他们很高大上,我们很low...大概是因为ehcache和spring结合比较好,通过注解使用太简单了吧.).
这篇文章主要分享ehcache公司是怎么使用的.
配置
Spring引入ehcache
配置倒也没啥好说的.网上百度一大堆,一般其他框架和Spring整合的时候都是配置一个Spring的XXXXFactoryBean.ehcache也不例外.
1 <bean id="ehCacheManager" 2 class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 3 <property name="configLocation" value="classpath:ehcache.xml" /> 4 <property name="shared" value="true" /> 5 </bean> 6 7 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 8 <property name="cacheManager" ref="ehCacheManager" /> 9 </bean> 10 11 <cache:annotation-driven cache-manager="cacheManager" />
EhCacheManagerFactoryBean就是为了在程序启动的时候生成CacheManager,这种FactoryBean据我观察一般都是实现了afterPropertiesSet方法来参与Spring的声明周期.
我以前自己学习的时候并没有用过什么缓存,对ehcache也并不怎么了解.但是我觉得EhCacheCacheManager应该就是类似乎Hibernate的session那样的,给我们这样的使用者提供一些常用的便利方法的这样一个面板吧.
ehcache配置
每个框架肯定也有自己的一些配置,ehcache也同样,公司用缓存主要是缓存代码表和参数表里的数据,比如税务机关的代码呀,系统的参数呀类似的.
1 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> 2 3 <diskStore path="${java.io.tmpdir}/xxx/cache" /> 4 5 6 7 <cache name="message" maxElementsInMemory="1" timeToLiveSeconds="86400" eternal="false" overflowToDisk="true" /> 8 9 10 11 </ehcache>
比如这一小段就是配置了一个系统提示信息的缓存.至于配置后面那些熟悉是什么意思....其实看熟悉名字就知道了...到底需要怎么配置可能还是要看具体需求...
具体使用
前面说过,公司主要缓存是用在参数表,代码表上面. 而参数表代码表的取值,我前面有一篇文章介绍过公司BaseCode的用法(http://www.cnblogs.com/abcwt112/p/6085335.html).缓存主要是用在那里.
比如前面那篇文章提到过的,通过Provider去取某张代码表的List的时候就是有缓存的.
1 @Override 2 @Cacheable(value = "basecode-common", key = "#defDto.codeType + "_CODE_LIST"") 3 public List<BaseCodeDTO> getCodeList(BaseCodeDefDTO defDto) { 4 if (defDto.getTableName() == null) { 5 return null;// NOSONAR 6 } 7 return codeService.getCodeListParamMap(defDto, null); 8 }
这个方法的方法体需不需要执行,是通过@Cacheable注解来控制的,注解里面有很多属性可以定制,但是公司基本都没用,只用到了value和key.value主要是对应前面缓存的一些配置,key主要是用于区分不同入参的情况下,哪些是已经有缓存了,可以直接取值,哪些是需要重新执行方法去取值的.
当然,公司也会提供一个方法去刷新缓存(比如URL)
1 @RequestMapping(value = "/refreshBaseCode") 2 public String refreshBaseCode() { 3 appManagementFacade.refreshBaseCode(); 4 appManagementFacade.refreshQxswjg(); 5 appManagementFacade.refreshSbjbjg(); 6 appManagementFacade.refreshMessage(); 7 return "basecodeRefresh"; 8 }
1 @CacheEvict(value="message",allEntries=true) 2 public void refreshMessage(){ 3 LOGGER.info("Refresh message"); 4 }
刷新缓存也是利用Spring提供的注解.
小结
公司使用在缓存方面使用的还是比较简单的,基本就是缓存了代码表和参数表,提示信息等..使用方法也是直接使用Spring的注解.所以缓存对于我们开发来说基本算是透明的吧.