zoukankan      html  css  js  c++  java
  • Ehcache缓存数据

    1.ehcahe简介

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

    看到官网上已经3.0了。

    2.作用

    我把它当做一个可以存储数据和读取数据的存在。缓存其实就一个key-value的数据存储工具。目前我使用过两个方面。

    一是缓存数据库的数据。

    都说连接数据库的开销很大,所以对数据变化较小的一部分可以缓存起来,下次直接从缓存中取数据。(关于数据的安全性未曾考虑)。

    二是存储变量。

    在web后端开发过程中,有些数据需要保存起来方便下次使用。比如短信的验证码。我之前都是在类中添加一个map类变量,然后存入map,下次取出或者销毁。这样做事可以的,类实例化后。类变量就加载到内存中了,可以存储数据。但有个问题,关于类的创建和销毁的声明周期问题。不能确保他什么时候去销毁。或者说,这一块我了解有限,还没研究到。

    因此,放到缓存中就可以了。缓存可以设置数据的大小,失效时间。

    3.简单运用

    (1)概述

    Ehcache是一个纯Java的进程内缓存框架,具有快速‘精干等特点。

    本文基于2.10.X以上版本

    (2)在pom.xml添加相关包依赖

    <!--  ehcache缓存包-->
    <dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    </dependency>

    <!-- spring-context-support包含有Spring对于缓存功能的抽象封装接口-->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    </dependency>

    (3)HelloWorld实例使用Ehcache缓存

    1.在classpath下添加ehcache.xml配置文件,添加一个名为helloworld的缓存
    --------------------------------------------------------------------------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    <!-- 磁盘缓存位置 -->
    <diskStore path="java.io.tmpdir/ehcache"/>

    <!-- 默认缓存 -->
    <defaultCache
    maxEntriesLocalHeap="10000"
    eternal="false"
    timeToIdleSeconds="120"
    timeToLiveSeconds="120"
    maxEntriesLocalDisk="10000000"
    diskExpiryThreadIntervalSeconds="120"
    memoryStoreEvictionPolicy="LRU"/>

    <!-- helloworld缓存 -->
    <cache name="helloworld"
    maxElementsInMemory="1000"
    eternal="false"
    timeToIdleSeconds="5"
    timeToLiveSeconds="5"
    overflowToDisk="false"
    memoryStoreEvictionPolicy="LRU"/>

    </ehcache>
    -------------------------------------------------------------------------------------------------------

    <!-- <defaultCache
    maxElementsInMemory="10000" 内存中最大缓存对象数
    eternal="false" Element是否永久有效,一但设置了,timeout将不起作用
    timeToIdleSeconds="120" 设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
    timeToLiveSeconds="120" 设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
    overflowToDisk="true" 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上
    maxElementsOnDisk="10000000" 磁盘缓存大小默认是没有限制的,不过可通过maxElementsOnDisk来指定。当磁盘缓存达到maxElementsOnDisk指定的值时,Ehcache会清理磁盘中的缓存使用默认策略是LFU(使用频率最低)。
    diskPersistent="false" 在VM重启的时候是否持久化磁盘缓存,默认是false。
    diskExpiryThreadIntervalSeconds="120" 磁盘缓存的清理线程运行间隔,默认是120秒.
    memoryStoreEvictionPolicy="LRU" 当内存缓存达到最大,有新的element加入的时候,移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO可对缓存中的element配置诸如监听器和加载器。
    /> -->

    <!-- <cache
    name="sampleCache" cache唯一标识
    maxElementsInMemory="5" 内存中最大缓存对象数
    maxElementsOnDisk="100" 磁盘缓存大小默认是没有限制的,不过可通过maxElementsOnDisk来指定。当磁盘缓存达到maxElementsOnDisk指定的值时,Ehcache会清理磁盘中的缓存使用默认策略是LFU(使用频率最低)。
    eternal="false" Element是否永久有效,一但设置了,timeout将不起作用
    timeToIdleSeconds="2" 设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
    timeToLiveSeconds="2" 设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
    overflowToDisk="true" 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上
    /> -->

    ehcache.xml配置参数说明:

    • name:缓存名称。
    • maxElementsInMemory:缓存最大个数。
    • eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
    • timeToIdleSeconds:置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
    • timeToLiveSeconds:缓存数据的生存时间(TTL),也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
    • maxEntriesLocalDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
    • overflowToDisk:内存不足时,是否启用磁盘缓存。
    • diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
    • maxElementsOnDisk:硬盘最大缓存个数。
    • diskPersistent:是否在VM重启时存储硬盘的缓存数据。默认值是false。
    • diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
    • memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
    • clearOnFlush:内存数量最大时是否清除。


    -------------------------------------------------------------------------------------------------------

    2.EhcacheDemo.java文件
    Ehcache会自动加载classpath根目录下名为ehcache.xml文件。
    EhcacheDemo的工作步骤如下:
    在EhcacheDemo中,我们引用ehcache.xml声明的名为helloworld的缓存来创建Cache对象;
    然后我们用一个键值对来实例化Element对象;
    Element对象添加到Cache
    然后用Cache的get方法获取Element对象。
    ----------------------------------------------------------------------------------------
    package com.agesun.attendance.web.controller;
    import net.sf.ehcache.Cache;
    import net.sf.ehcache.CacheManager;
    import net.sf.ehcache.Element;
    public class EhcacheDemo {

    public static void main(String[] args){
           // Create a cache manager 创建缓存管理者
    final CacheManager cacheManager=new CacheManager();
    // create the cache called "helloworld" 引用ehcache.xml申明的的名为helloworld的缓存创建Cache对象
    final Cache cache=cacheManager.getCache("helloworld");
    // create a key to map the data to
    final String key="greeting";
    // Create a data element
    final Element putGreeting=new Element(key,"Hello,World!");
    // Put the element into the data store //将map对象放到cache缓存里
    cache.put(putGreeting);
    // Retrieve the data element //从cache对象中获得到元素
    final Element getGreeting=cache.get(key);
    // Retrieve the data element
    System.out.println(getGreeting.getObjectValue());
        }

    }
    ----------------------------------------------------------------------------------

    输出:


    (4)Ehcache基本操作

    Element、Cache、cacheManager是Ehcacle最重要的API

    Element:缓存的元素,维护着一个键值对
    Cache:是Ehcache的核心类,他有多个Element,并被CacheManager管理,它实现了对缓存的逻辑行为
    CacheManager:Cache的容器对象, 并管理着Cache的生命周期。


    4.ehcache基本原理

    ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate,  Spring,Cocoon等其他开源系统

    Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。

    ehcache的刷新策略 ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较

    ehcache缓存的3种清空策略: 1 FIFO,先进先出 2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。 3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

    事件处理 可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。 可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。

  • 相关阅读:
    SQL 脚本 重复执行 约束
    xiami 精选集
    PHP 5 环境配置
    Thread线程类
    创建线程
    C#中简单的正则表达式(也经常会用到的)
    线程的挂起与恢复
    C#操作INI文件
    多线程简介
    单线程简介
  • 原文地址:https://www.cnblogs.com/tongcc/p/11269339.html
Copyright © 2011-2022 走看看