自定义ehcache工具类实现缓存

缓存是为提升性能而开辟的内存空间, 其主要目的是暂存数据的处理结果,以供下次使用。缓存的使用很多,比如浏览器会缓存网页,在服务器后台的API 中加入缓存提高系统的性能,在常用的开发中,经常会用到hibernate, hibernate 开启二级缓存就有可能用到ehcache, 当然现成的缓存框架很多,比如:ehcache,oscache,jboss cache等。这些缓存框架其实也是可以单独使用的。比如下面用使用ehcache 做的缓存。

EHCache 缓存配置文件 [/ b]
程序代码 程序代码

<ehcache>    
    <diskStore path="data/ehcache" />
    <defaultCache maxElementsInMemory="10000" eternal="false"
        overflowToDisk="true" timeToIdleSeconds="120" timeToLiveSeconds="120"
        diskPersistent="false" diskExpiryThreadIntervalSeconds="120" />

    <cache name="cache1" maxElementsInMemory="100" eternal="false"
        timeToIdleSeconds="6" timeToLiveSeconds="60" overflowToDisk="true"
        diskPersistent="false" />

    <cache name="cache2" maxElementsInMemory="100000" eternal="false"
        timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="false"
        diskPersistent="false" />
</ehcache>


maxElementsInMemory:该缓存中允许存放的最大条目数量。
eternal:缓存内容是否永久储存。
overflowToDisk:如果内存中的数据超过maxElementsInMemory,是否使用磁盘存储。
timeToIdleSeconds:如果不是永久储存的缓存,那么在timeToIdleSeconds指定时间内没有访问一个条目,则移除它。
timeToLiveSeconds:如果不是永久储存的缓存,一个条目可以存在的最长时间。
diskPersistent:磁盘储存的条目是否永久保存。
diskExpiryThreadIntervalSeconds:磁盘清理线程的运行时间间隔。

[b]ehcache的初始化

要使用ehcache就首先要进行初始化, 最好是做成单例类,以供后面使用,这里测试,没这样写。
程序代码 程序代码

static CacheManager manager=null;
static String configfile="ehcache.xml";
static{
        try {
            manager = CacheManager.create(EHCacheUtil.class.getClassLoader().getResourceAsStream(configfile));
        } catch (CacheException e) {
            e.printStackTrace();
        }
    }


缓存,最常见的方式,自己也可以用hashmap来实现,所以即使你用了ehcache,map中最常见的方法put,get 等方法仍然需要你自己实现。
程序代码 程序代码

package com.yihaomen.cache;

import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class EHCacheUtil {

    static CacheManager manager=null;
    static String configfile="ehcache.xml";
    static{
        try {
            manager = CacheManager.create(EHCacheUtil.class.getClassLoader().getResourceAsStream(configfile));
        } catch (CacheException e) {
            e.printStackTrace();
        }
    }
    
    public static void put(String cachename,Serializable key,Serializable value){
        manager.getCache(cachename).put(new Element(key, value));
    }
    
    public static Serializable get(String cachename,Serializable key){
        try {
            Element e=manager.getCache(cachename).get(key);
            if(e==null)return null;
            return e.getValue();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (CacheException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public static void clearCache(String cachename){
        try {
            manager.getCache(cachename).removeAll();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
    
    public static void remove(String cachename,Serializable key){
        manager.getCache(cachename).remove(key);
    }
}



在完成了上面的工具类之后,可以写一个测试代码:
程序代码 程序代码

package com.yihaomen.cache;

import static org.junit.Assert.*;

import org.junit.Test;

public class TestEHCacheUtil {

    @Test
    public void test1() throws InterruptedException {
        EHCacheUtil.put("cache1", "key1","value1");
        System.out.println(EHCacheUtil.get("cache1", "key1"));
        for(int i=0;i<7;i++){
            Thread.sleep(1000);
        }
        System.out.println(EHCacheUtil.get("cache1", "key1"));
    }
    
    @Test
    public void test2() throws InterruptedException {
        for(int i=0;i<200;i++){
            EHCacheUtil.put("cache1", "key"+i,"value"+i);
            System.out.println("i="+i+" key"+ i +"=" + EHCacheUtil.get("cache1", "key"+i));
        }
    }
}



这样就完成了自己基于ehcache的缓存框架定义。

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: ehcache
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.