cache在项目中总是少不了的,如果不想把cache模块独立出来,比如(memcached、redis)等,希望有一个集成在项目中的小型、简单的cache,ehcache也是不错的,它是用java开发的。
spring配置的bean如下,首先需要个cacheManger,它关联了cache配置的一些信息,下面的bean表明cache配置在ehcache.xml中
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml" />
<property name="shared" value="true" />
</bean>
ehcache.xml的配置如下,有个默认的cache,还有个命名的cache,有生存时间,最大存储个数等配置
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="5000"
eternal="true"
timeToLiveSeconds="300"
overflowToDisk="false" />
<cache
name="vDataCache"
maxElementsInMemory="10000"
eternal="false"
timeToLiveSeconds="3600"
overflowToDisk="false"
diskPersistent="false" />
</ehcache>
然后在spring的bean配置中有如下内容,这样就把vDataCache关联上配置文件中vDataCache的参数了。并且注入到vDataCacheUtil的cache变量中。注意此处vDataCacheUtil的生成时通过工厂方法生成的。
<bean id="vDataCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager" ref="cacheManager" />
<property name="cacheName" value="vDataCache" />
</bean>
<bean id="vDataCacheUtil" class="com.XXX.spaces.web.util.VDataCacheUtil" factory-method="getInstance">
<property name="cache" ref="vDataCache"/>
</bean>
public class VDataCacheUtil {
private static VDataCacheUtil instance = null;
private static final Logger LOG = LoggerFactory.getLogger(VDataCacheUtil.class);
private Cache cache;
private VDataCacheUtil(){}
public static VDataCacheUtil getInstance() {
if (instance == null) {
synchronized (VDataCacheUtil.class) {
if (instance == null)
instance = new VDataCacheUtil();
}
}
return instance;
}
public Object get(String key) {
if (cache == null) {
return null;
}
try {
Element e = cache.get(key);
if (e != null) {
return e.getObjectValue();
}
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
return null;
}
public void put(String key, Object obj) {
if (cache == null || key == null || obj == null) {
return;
}
try {
Element e = new Element(key, obj);
cache.put(e);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
}
public Cache getCache() {
return cache;
}
public void setCache(Cache cache) {
this.cache = cache;
}
}
使用代码
private VDataCacheUtil vDataCacheUtil = VDataCacheUtil.getInstance();
// cache
String k = "trends-sohu" + videoId;
Long[] playData = (Long[]) vDataCacheUtil.get(k);
if (playData == null) {
playData = weMediaVideoPlayCountService
.getVideoPlayCountAndPlayTimeAll(videoId);
if (playData != null) {
vDataCacheUtil.put(k, playData);
} else {
playData = new Long[] { 0L, 0L };
}
}
// cache end