`
tjbmx0987
  • 浏览: 51598 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

ehcache 例子

阅读更多
一.介绍与应用场景
ehcache是一开源缓存工具,其许可证为Apache License, Version 2.0,非常友好的许可。在 sourceforge.net 上可找到它的最新版本。
缓存应用在多个领域并发挥作用,ehcache可应用于数据库访问缓存,安全认证缓存,web缓存,soap 和 RESTFul 服务缓存,应用程序持久对象缓存以及分布式缓存。


二.架设开发环境
无它,只需把ehcache的相关jar包放到classpath下,把配置文件ehcache.xml放在classpath下就可以进行应用开发了。下面是配置文件中默认配置的xml节点的内容
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskSpoolBufferSizeMB="30"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
原文件中有比较详尽的注释,在这里我简单翻译几个
1.必须要有的属性:
name: cache的名字,用来识别不同的cache,必须惟一。
maxElementsInMemory: 内存管理的缓存元素数量最大限值。
maxElementsOnDisk: 硬盘管理的缓存元素数量最大限值。默认值为0,就是没有限制。
eternal: 设定元素是否持久话。若设为true,则缓存元素不会过期。
overflowToDisk: 设定是否在内存填满的时候把数据转到磁盘上。
2.下面是一些可选属性:
timeToIdleSeconds: 设定元素在过期前空闲状态的时间,只对非持久性缓存对象有效。默认值为0,值为0意味着元素可以闲置至无限长时间。
timeToLiveSeconds: 设定元素从创建到过期的时间。其他与timeToIdleSeconds类似。
diskPersistent: 设定在虚拟机重启时是否进行磁盘存储,默认为false.(我的直觉,对于安全小型应用,宜设为true)。
diskExpiryThreadIntervalSeconds: 访问磁盘线程活动时间。
diskSpoolBufferSizeMB: 存入磁盘时的缓冲区大小,默认30MB,每个缓存都有自己的缓冲区。
memoryStoreEvictionPolicy: 元素逐出缓存规则。共有三种,Recently Used (LRU)最近最少使用,为默认。 First In First Out (FIFO),先进先出。Less Frequently Used(specified as LFU)最少使用。


三.实例编写
继续以往的作风,用代码说话。代码中有良好的注释。(代码参考字官方文档)
1. 使用 CacheManager
package tutorial;  

import java.io.File;  
import java.io.FileInputStream;  
import java.io.InputStream;  
import java.net.URL;  

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

/** 
* 使用 CacheManager 
* @author zhangyt 

*/
public class UsingTheCacheManager {  
public static void main(String[] args) throws Exception {  
//1.
//创建CacheManager单例对象,使用默认配置
        CacheManager.create();  
        String[] cacheNames1 = CacheManager.getInstance().getCacheNames();  
//关闭
        CacheManager.getInstance().shutdown();  

//2.
//用默认配置创建对象可用此创建多例
        CacheManager manager2 = new CacheManager();  
        String[] cacheNames2 = manager2.getCacheNames();  
        manager2.shutdown();  

//3.加载配置的方式
//3.1 用默认配置加载在上面已经提到。即需要在classpath下放置ehcache.xml配置文件
//3.2 用指定配置文件路径的方式创建
        CacheManager manager31 = new CacheManager("src/config/ehcache.xml");  
        manager31.shutdown();  
//3.2 用classpath下的配置文件生成
        URL url = UsingTheCacheManager.class.getClassLoader().getResource("config/ehcache.xml");  
        CacheManager manager32 = new CacheManager(url);  
        manager32.shutdown();  
//3.3 通过输入流生成
        InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());  
try {  
            CacheManager manager33 = new CacheManager(fis);  
            manager33.shutdown();  
        } finally {  
            fis.close();  
        }  

//4. 以编程的方式添加和删除cache
        CacheManager singletonManager4 = CacheManager.create();  
//4.1 用默认配置添加
        singletonManager4.addCache("test41");  
        Cache test41 = singletonManager4.getCache("test41");  
        System.out.println(test41 != null);  
//4.2 创建一个cache并添加到CacheManager
        Cache memoryOnlyCache = new Cache("test42", 5000, false, false, 5, 2);  
        singletonManager4.addCache(memoryOnlyCache);  
        Cache test42 = singletonManager4.getCache("test42");  
//4.3 删除cache
        singletonManager4.removeCache("sampleCache1");  
        singletonManager4.shutdown();  
    }  

package tutorial;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.net.URL;

import net.sf.ehcache.Cache;

import net.sf.ehcache.CacheManager;

/** * 使用 CacheManager * @author zhangyt * */

public class UsingTheCacheManager {

      public static void main(String[] args) throws Exception {

            //1.            //创建CacheManager单例对象,使用默认配置

            CacheManager.create();

            String[] cacheNames1 = CacheManager.getInstance().getCacheNames();            //关闭

            CacheManager.getInstance().shutdown();          

             //2.            //用默认配置创建对象可用此创建多例

            CacheManager manager2 = new CacheManager();

            String[] cacheNames2 = manager2.getCacheNames();

            manager2.shutdown();           

            //3.加载配置的方式

            //3.1 用默认配置加载在上面已经提到。即需要在classpath下放置ehcache.xml配置文件

            //3.2 用指定配置文件路径的方式创建

            CacheManager manager31 = new CacheManager("src/config/ehcache.xml");

            manager31.shutdown();

            //3.2 用classpath下的配置文件生成

            URL url = UsingTheCacheManager.class.getClassLoader().getResource("config/ehcache.xml");

            CacheManager manager32 = new CacheManager(url);

            manager32.shutdown();

            //3.3 通过输入流生成

            InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());

            try {

               CacheManager manager33 = new CacheManager(fis);

               manager33.shutdown();

            } finally {

               fis.close();

            }            

           //4. 以编程的方式添加和删除cache

            CacheManager singletonManager4 = CacheManager.create();

            //4.1 用默认配置添加

            singletonManager4.addCache("test41");

            Cache test41 = singletonManager4.getCache("test41");

            System.out.println(test41 != null);

            //4.2 创建一个cache并添加到CacheManager

            Cache memoryOnlyCache = new Cache("test42", 5000, false, false, 5, 2);

            singletonManager4.addCache(memoryOnlyCache);

            Cache test42 = singletonManager4.getCache("test42");

            //4.3 删除cache

            singletonManager4.removeCache("sampleCache1");

            singletonManager4.shutdown();

      }}

2. 使用 Caches
package tutorial;  

import java.io.Serializable;  
import java.lang.management.ManagementFactory;  

import javax.management.MBeanServer;  

import net.sf.ehcache.Cache;  
import net.sf.ehcache.CacheManager;  
import net.sf.ehcache.Element;  
import net.sf.ehcache.management.ManagementService;  

/** 
* 使用 Caches 
* @author zhangyt 

*/
public class UsingCaches {  
public static void main(String[] args) {  
        CacheManager.create();  
        CacheManager manager= CacheManager.getInstance();  
//1.取得Cache
        Cache cache = manager.getCache("sampleCache1");  

//2.执行 CRUD 操作
//2.1  增加元素
        Element element1 = new Element("key1", "value1");  
        Element element2 = new Element("key2", "value2");  
        cache.put(element1);  
        cache.put(element2);  
//2.2 更新元素
        cache.put(new Element("key1", "value1u"));  
//2.3 取值
//取得一个序列化了的值
        Element element231 = cache.get("key1");  
        Serializable value231 = element231.getValue();  
        System.out.println(value231);  
//取得一个不是序列化的值
        Element element232 = cache.get("key1");  
        Object value232 = element232.getObjectValue();  
        System.out.println(value232);  
//3.4 删除一个元素
        cache.remove("key2");  
        System.out.println(cache.get("key2") == null);  

//3. 强硬命令写入硬盘
        cache.flush();  

//4. 取得缓存的大小
//得到总的缓存数目
int elements = cache.getSize();  
        System.out.println(elements);  
//得到在内存中的元素数量
long elementsInMemory = cache.getMemoryStoreSize();  
        System.out.println(elementsInMemory);  
//得到硬盘中的缓存元素数量
long elementsInDisk = cache.getDiskStoreSize();  
        System.out.println(elementsInDisk);  

/** 
         * 在官方文档中有cache.getHitCount();等相关方法,在这里已经找不到 
         * 应该是版本变迁的原因。 
         */

//5.高级主题 注册mbean 也许在以后的高级主题中会进一步阐述
        CacheManager manager1 = new CacheManager();  
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();  
        ManagementService.registerMBeans(manager1, mBeanServer, false, false, false, true);  

        manager.shutdown();  
    }  

package tutorial;

import java.io.Serializable;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;

import net.sf.ehcache.Cache;

import net.sf.ehcache.CacheManager;

import net.sf.ehcache.Element

;import net.sf.ehcache.management.ManagementService;

/** * 使用 Caches * @author zhangyt * */

public class UsingCaches {

      public static void main(String[] args) {

            CacheManager.create();

            CacheManager manager= CacheManager.getInstance();

            //1.取得Cache

            Cache cache = manager.getCache("sampleCache1");            

           //2.执行 CRUD 操作

            //2.1 增加元素

            Element element1 = new Element("key1", "value1");

            Element element2 = new Element("key2", "value2");

            cache.put(element1);

            cache.put(element2);

            //2.2 更新元素

            cache.put(new Element("key1", "value1u"));

            //2.3 取值

            //取得一个序列化了的值

            Element element231 = cache.get("key1");

            Serializable value231 = element231.getValue();

            System.out.println(value231);

           //取得一个不是序列化的值

            Element element232 = cache.get("key1");

            Object value232 = element232.getObjectValue();

            System.out.println(value232);

            //3.4 删除一个元素

            cache.remove("key2");

            System.out.println(cache.get("key2") == null);            

           //3. 强硬命令写入硬盘

            cache.flush();           

            //4. 取得缓存的大小

            //得到总的缓存数目

            int elements = cache.getSize();

            System.out.println(elements);

            //得到在内存中的元素数量

            long elementsInMemory = cache.getMemoryStoreSize();

            System.out.println(elementsInMemory);

            //得到硬盘中的缓存元素数量

            long elementsInDisk = cache.getDiskStoreSize();

            System.out.println(elementsInDisk);           

            /**             * 在官方文档中有cache.getHitCount();等相关方法,在这里已经找不到             * 应该是版本变迁的原因。             */                           //5.高级主题 注册mbean 也许在以后的高级主题中会进一步阐述

            CacheManager manager1 = new CacheManager();

         MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

         ManagementService.registerMBeans(manager1, mBeanServer, false, false, false, true);

            manager.shutdown();

      }}

看了以上的内容,相信对ehcache就可以进行一般的应用了,更高级的主题,也许在以后探讨。




分享到:
评论
3 楼 liu119361940 2014-01-24  
好。。。挺不错
2 楼 lulu123456 2013-09-06  
 
1 楼 yangpeihai 2012-07-10  
深入浅出,受益匪浅,非常感谢楼主的分享,期待楼主的高级篇

相关推荐

Global site tag (gtag.js) - Google Analytics