`
zhyt710
  • 浏览: 202963 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ehcache1.6使用(1)-- 基础

阅读更多

一.介绍与应用场景

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();
	}
}

 

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();
	}
}

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics