【Java】:ehcache

ehcache是一个纯Java进程内缓存框架,是hibernate默认的Cacheprovider。(出自百度百科)。

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

⑴、简单代码实现:

配置文件2个ehcache.xml 、ehcache.xsd

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="true" monitoring="autodetect"
         dynamicConfig="true">
    <diskStore path="d:/file"/>
 <cache name="ehcache1"
    maxElementsInMemory="100"
    maxElementsOnDisk="0"
    eternal="false"
    timeToIdleSeconds="300000"
    timeToLiveSeconds="300000"
    diskPersistent="true"
    overflowToDisk="true"
    />  

</ehcache>

demo调用:

这种调用方式若属性配置了虚拟机重启缓存数据将会报错:

package com.jws.app.junt;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/**
 * ehcache框架测试
 * @author Administrator
 *
 */
public class ehcacheDemo {
    public static void main(String[] args) {
            //CacheManager manager1 = CacheManager.newInstance("src/config/ehcache1.xml");
            CacheManager manager = CacheManager.create();
            Cache cache = manager.getCache("ehcache1");
            // manager.addCache("ehcache2");
             //Cache test = manager.getCache("ehcache2");
            cache.put(new Element("key1", "values1"));
            cache.put(new Element("key2", "values2"));
            cache.put(new Element("key3", "values3"));
            Element element = cache.get("key1");
            System.out.println(element.getValue());
            cache.flush();
    }

}

    配置文件详解:

maxElementsInMemory:    内存中允许缓存的最大数量,若超过这个数量,数据将缓存在磁盘。

maxElementsOnDisk:   硬盘中缓存的最大数量,0表示无限大。

    eternal: 对象是否永久有效,一但设置了,timeout将不起作用。

    timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。

    timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。

    overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。

    diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。

    maxElementsOnDisk:硬盘最大缓存个数。

    diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.

    diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
         memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。

clearOnFlush:内存数量最大时是否清除。

    

以下属性是可选的:
timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
diskPersistent: 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
memoryStoreEvictionPolicy:
如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。

缓存的3 种清空策略
FIFO ,first in first out (先进先出).
LFU , Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
LRU ,Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.sf.net/ehcache.xsd">

    <diskStore path="d:/file" />

    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        overflowToDisk="true"
        timeToIdleSeconds="10"
        timeToLiveSeconds="20"
        diskPersistent="false" />

    <cache name="requestCache"
        maxElementsInMemory="100000"
        eternal="false"
        overflowToDisk="false"
        timeToIdleSeconds="180"
        timeToLiveSeconds="180"
        diskPersistent="false"
        memoryStoreEvictionPolicy="LFU" />

    <cache name="myCache"
        maxElementsInMemory="2"
        eternal="false"
        overflowToDisk="true"
        timeToIdleSeconds="180"
        timeToLiveSeconds="180"
        maxElementsOnDisk="0"
        diskPersistent="true"
        memoryStoreEvictionPolicy="LFU" />
</ehcache>
package com.jws.app.junt;

import java.util.List;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/**
 * ehcache框架测试
 * @author Administrator
 *
 */
public class ehcacheDemo {
     public static void main(String[] args) {
            // 指定ehcache.xml的位置
            String fileName = "src/main/resources/ehcache.xml";
            CacheManager manager = new CacheManager(fileName);
            // 取出所有的cacheName
            Cache cache = manager.getCache("myCache");
            System.out.println(cache.getSize());
            //获取单个节点
            Element el =  cache.get("key1812");
            System.out.println("【单个节点】"+el.getValue());
            el  =  cache.get(1);
            //System.out.println("【单个节点2】"+el.getValue());
             List<Element> cl = cache.getKeys();
           //  cl.size();

//
//        for(int i=0;i<1000;i++){
//                cache.put(new Element("key1"+ i , "values1"+i));
//            }
//            

//            cache.flush();

            manager.shutdown();
        }
}
package com.jws.common.util;

import java.util.List;

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

/**
 * EHcache工具类 
 * @author Administrator
 *
 */
public class EHCacheConfig {

        /**
         * 当前采用的缓存对象
         */
        public static String cacheObject = "myCache";
        private static CacheManager cacheManager = null;
        private static Cache cache = null;  

        static{
            EHCacheConfig.initCacheManager();
            EHCacheConfig.initCache();
        }  

           /**
         *
         * 初始化缓存管理容器
         */
        public static CacheManager initCacheManager() {
            try {
                if (cacheManager == null)
                    System.out.println("【EHcache start............】");
                    cacheManager = CacheManager.getInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return cacheManager;
        }  

        /**
         * 初始化cache
         * @return
         */
        public static Cache initCache() {
            if(cache ==null){
                  cache = cacheManager.getCache("myCache");
                    System.out.println("【EHcache cache start............】");
            }
            return cache;
        }
        /**
         *
         * 添加缓存
         *
         * @param key
         *            关键字
         * @param value
         *            值
         */
        public static void put(Object key, Object value) {
            // 创建Element,然后放入Cache对象中
            Element element = new Element(key, value);
            cache.put(element);
        }  

        /**
         * 获取cache
         *
         * @param key
         *            关键字
         * @return
         */
        public static Object get(Object key) {
            Element element = cache.get(key);
            if (null == element) {
                return null;
            }
            return element.getObjectValue();
        }
        /**
         * 移除所有cache
         */  

        /**
         * 释放CacheManage
         */  

        public static void shutdown() {
            cacheManager.shutdown();
        }  

        public static void removeAllCache() {
            cacheManager.removalAll();
        }
        /**
         *
         * 移除所有Element
         */
        public static void removeAllKey() {
            cache.removeAll();
        }
        /**
         *
         * 获取所有的cache名称
         * @return
         */
        public static String[] getAllCaches() {
            return cacheManager.getCacheNames();
        }
        /**
         *
         * 获取Cache所有的Keys
         * @return
         */
        public static List<Element> getKeys() {
            return cache.getKeys();
        }  

}
时间: 2024-08-26 08:27:28

【Java】:ehcache的相关文章

【Java】:压缩成多个压缩卷

Java自带的库不支持压缩成多个压缩卷,找到了一个开源库 zip4j ,发现更好用 so easy package com.jws.common.mail; import java.io.File; import net.lingala.zip4j.core.ZipFile;import net.lingala.zip4j.exception.ZipException;import net.lingala.zip4j.model.ZipParameters; import org.apache.

【Java】Java网络编程菜鸟进阶:TCP和套接字入门

Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)这两个数据传输协议的支持.本文开始探讨 TCP. TCP 基础知识 在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换.TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制.

初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM,字节码 两个命令: javac helloworld.java:将Java文件编译为字节码的.class文件 java helloworld:运行Java程序...??暂时这么认为 数据类型: 普通数据类型:int a=3; 对象数据类型:使用关键字new,String s=new String("

【Java】Java还是.Net

网友一: 现在也跟着团队做了几个项目了,慢慢我觉得.Net无论是在语言设计.框架设计等各方面都比Java来得漂亮,是真正的后起之秀,在Studio环境下编程那是行云流水.但每次我写Java程序时,一打开Jbuilder或者Eclipse时,那慢得如牛的启动速度,极不人性化的操作就直皱眉头,可现实是,人家Java比.Net混得滋润得多,因为人家大度,人家海纳百川,所以钱财滚滚. 每次我们去谈项目的时候,金融.电信行业的用户就明确表示不用.Net,为什么?人家的服务器都是Unix的,.Net在这里连

【Java】String,StringBuffer与StringBuilder的区别??

String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以

【java】Windows7 下设置环境变量

Windows 7下配置JDK环境变量參数设置: 1.    安装JDK,安装过程中能够自己定义安装文件夹等信息,比如我们选择安装文件夹为:D:\Program Files (x86)\Java\jdk1.6.0_25 2.    安装完毕后,右击"我的电脑",点击"属性",单击"高级系统设置",点击"环境变量",如图: 4.    在"系统变量"中,设置3项属性,JAVA_HOME,PATH,CLASSP

【Java】代处理?代理模式 - 静态代理,动态代理

>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算,见[Java]Float计算不准确) package com.nicchagil.study.java.demo.No09代理.No01不用代理; import java.math.BigDecimal; public class FloatCalculator { public float add(fl

【Java】利用synchronized(this)完成线程的临界区

在<[Java]线程并发.互斥与同步>(点击打开链接)中利用了操作系统通过操作信号量控制的原始方法,完成了线程的互斥与同步,说句题外话,其实这个信号量的算法,是著名的迪杰斯特拉创造的,也就是数据结构.计算机网络上面最短路径算法.迪杰斯特拉算法.Dijkstra算法的贡献人.其实Java里面根本就不需要自己定义一个信号量来实现临界区,Java对于临界区的实现早已封装好了,而且synchronized还是Java的关键字. 那么,到底怎么来使用这个关键字呢?下面就对上次<[Java]线程并发

【Java】如何访问服务器

HTTP协议---------->GET.POST.XMLHttpRequest TCP/IP协议 SOAP协议---------->Web Service Server的作用是处理HTTP请求.WebService的SOAP请求.TCP/IP请求.FTP. TCP/IP请求--------->ServerSocket.Socket  java.net包和javax.net包 java类库中的网络软件包提供了一系列的类和接口,实现网络通信功能. java.net/javax.net---