基于ConcurrentMapCache示例 - 书目录

基于ConcurrentMapCache示例

自定义CacheManager

我需要使用有容量限制和缓存失效时间策略的Cache,默认的ConcurrentMapCacheManager没法满足
通过实现CacheManager接口定制出自己的CacheManager。
还是拷贝ConcurrentMapCacheManager,使用Guava的Cache做底层容器,因为Guava的Cache容器可以设置缓存策略

新增了exp、maximumSize两个策略变量
修改底层Cache容器的创建

下面只列出自定义的代码,其他的都是Spring的ConcurrentMapCacheManager的代码

import com.google.common.cache.CacheBuilder;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.concurrent.ConcurrentMapCache;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

/**
 * 功能说明:自定义的ConcurrentMapCacheManager,新增超时时间和最大存储限制
 * 作者:liuxing(2015-04-13 18:44)
 */
public class ConcurrentMapCacheManager implements CacheManager {

    /**
     * 过期时间,秒(自定义)
     */
    private long exp = 1800;
    /**
     * 最大存储数量 (自定义)
     */
    private long maximumSize = 1000;

    public void setExp(long exp) {
        this.exp = exp;
    }

    public void setMaximumSize(long maximumSize) {
        this.maximumSize = maximumSize;
    }

    /**
     * 创建一个缓存容器,这个方法改写为使用Guava的Cache
     * @param name
     * @return
     */
    protected Cache createConcurrentMapCache(String name) {
        return new ConcurrentMapCache(name, CacheBuilder.newBuilder().expireAfterWrite(this.exp, TimeUnit.SECONDS)
                                                                     .maximumSize(this.maximumSize)
                                                                     .build()
                                                                     .asMap(), isAllowNullValues());
    }
}

初始化

xml风格

<!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,指定一个默认的Manager,否则需要在注解使用时指定Manager -->
<cache:annotation-driven cache-manager="memoryCacheManager"/>

<!-- 本地内存缓存 -->
<bean id="memoryCacheManager" class="com.dooioo.ky.cache.ConcurrentMapCacheManager" p:maximumSize="2000" p:exp="1800">
    <property name="cacheNames">
        <list>
            <value>kyMemoryCache</value>
        </list>
    </property>
</bean>

使用

@Cacheable(value = "kyMemoryCache", key="targetClass + '.' + methodName")
public Map<String, String> queryMobiles(){
    // 业务代码省略
}

 

内容摘录于:http://liuxing.info/2015/06/18/Spring%20Cache%E4%BD%BF%E7%94%A8/