Ehcache的应用

Ehcache

简介
Ehcache是一个纯java的进程内缓存框架,具有快速、精干等特点,同时它也是Hibernate中默认的缓存方案。

主要的特性有:
1. 快速.
2. 简单.
3. 多种缓存策略
4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
5. 缓存数据会在虚拟机重启的过程中写入磁盘
6. 可以通过RMI、可插入API等方式进行分布式缓存
7. 具有缓存和缓存管理器的侦听接口
8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
9. 提供Hibernate的缓存实现

应用
ehcache的配置文件:

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache>  
<!-- maxElementsInMemory设定内存中创建对象的最大值 -->
<!-- eternal设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超 时限制且元素永不消亡。-->  
<!-- overflowToDisk设置当内存中缓存达到 maxInMemory 限制时元素是否可写到磁盘上 -->  
<!-- timeToIdleSeconds设置某个元素消亡前的停顿时间。  也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。  
             这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则 设置该属性也无用)。  
       如果该值是 0 就意味着元素可以停顿无穷长的时间。                                   
-->  
<!-- timeToLiveSeconds为元素设置消亡前的生存时间。 也就是一个元素从构建到消亡的最大时间间隔值。 这只能在元素不是永久驻留时有效。 
-->  
<!-- diskPersistent是否disk store在虚拟机启动时持久化。默认为false -->  
<!-- diskExpiryThreadIntervalSeconds运行disk终结线程的时间,默认为120秒 -->  


    <defaultCache  
        maxElementsInMemory="10000"   
        eternal="false"   
        overflowToDisk="true"   
        timeToIdleSeconds="500"   
        timeToLiveSeconds="1000"   
        diskPersistent="false"   
        diskExpiryThreadIntervalSeconds="120"/>   

     <!-- 测试 -->  
    <cache   
        name="cache_test"
        memoryStoreEvictionPolicy="LRU"   
        maxElementsInMemory="10"   
        eternal="false"  
        timeToIdleSeconds="7200"  
        timeToLiveSeconds="7200"   
        overflowToDisk="true" /> 
</ehcache>  

Ehcache的工具类

/**
 * Ehcache工具类
 *
 */
public class EhcacheUtil {
    private static final String path = "src/main/java/configuration/ehcache.xml";
    private static CacheManager cacheManager;

    /**
     * 创建一个缓存管理器
     */
    public static CacheManager getCacheManager() {
        if (cacheManager == null) {
            cacheManager = CacheManager.create(path);
        }
        return cacheManager;
    }

    /**
     *放入缓存 
     */
    public static void putCache(String cachename, Object key, Object value) {
        put(cachename, key, value);

    }

    /**
     * 获取缓存
     */
    public static Object getCacheValue(String cachename, Object key) {
        return getCache(cachename).get(key).getObjectValue();
    }

    public static void removeCache(String cachename, Object key) {
        remove(cachename, key);
    }

    /**
     *获取一个chache 
     */
    private static Cache getCache(String cachename) {
        cacheManager = getCacheManager();

        Cache cache = cacheManager.getCache(cachename);

        if (cache == null) {
            cacheManager.addCache(cachename);
            cache = cacheManager.getCache(cachename);
            cache.getCacheConfiguration().setEternal(true); 
            //放置在缓存中的对象永不过期
        }

        return cache;
    }

    /**
     * 放置缓存的私有方法
     */
    private static void put(String cachename, Object key, Object value) {
        Element element = new Element(key, value);
        getCache(cachename).put(element);
    }

    /**
     * 移除缓存的私有方法
     */
    private static void remove(String cachename, Object key) {
        getCache(cachename).remove(key);
    }
}

在这里没有用到数据库,所以编写了一个自带数据集合的一个类,用来替代:

public class PersonManagerImpl {  

    private static List<String> persons;  

    static {  
        persons = new ArrayList<String>();  

        persons.add("Wang");  
        persons.add("zang");  
        persons.add("Li");  
        persons.add("song");  
        persons.add("yan");  
    }  

    public List<String> getList() {  
        return persons;  
    }  

}  

配置文件和工具类编写完毕,下面进行测试

public class AppTest{
    static CacheManager cacheManager = EhcacheUtil.getCacheManager();

    @Test
    public void test() {
        PersonManagerImpl personManagerImpl = new PersonManagerImpl();
        for (int i = 0; i <3; i++) {
            if (i == 2) {
                EhcacheUtil.removeCache("cache_test", 1);
            }
            showinfo(personManagerImpl);
        }
    }

    public void showinfo(PersonManagerImpl personManagerImpl) {
        Cache cache = cacheManager.getCache("cache_test");
        if (cache.get(1) == null) {
            System.out.println("from DB");
            List<String> infos = personManagerImpl.getList();
            for (String s : infos) {
                System.out.println(s);
            }
            putCache();
        } else {
            System.out.println("from cache");
            List<String> list = 
        (List<String>)EhcacheUtil.getCacheValue("cache_test", 1);
            for (String s : list) {
                System.out.println(s);
            }
        }
    }

    public void putCache() {
        PersonManagerImpl personManagerImpl = new PersonManagerImpl();
        EhcacheUtil.putCache("cache_test", 1, personManagerImpl.getList());
    }

下面是测试输出结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值