编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Ehcache学习总结一: Ehcache简单实用

wxchong 2024-08-31 04:08:39 开源技术 7 ℃ 0 评论

一:Ehcache简介

1、Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

2、尤其互联网项目需要处理一些大数据、高并发、高性能需要用到缓存等。

二:Ehcache需要jar包

注意:log4j是Ehcache的依赖包,必须导入的。

三:再src目录下新建ehcache.xml文件

1、

2、内容如下

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

     <!-- 默认缓存 -->  
    <defaultCache  
 maxElementsInMemory="1000"  
 eternal="false"  
 timeToIdleSeconds="120"  
 timeToLiveSeconds="120"  
 overflowToDisk="false"/>  
 
    <!-- 指定名字缓存 -->      
    <cache name="studyCache"   
 maxElementsInMemory="1000"   
 eternal="false"
 timeToIdleSeconds="120"  
 timeToLiveSeconds="120"  
 overflowToDisk="true"   
 memoryStoreEvictionPolicy="LRU"/> 
 
</ehcache>

3、Ehcache参数说明

<diskStore>:当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口)。

<diskStore path="">:用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index。

name:缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里)。

maxElementsOnDisk:磁盘缓存中最多可以存放的元素数量,0表示无穷大。

maxElementsInMemory:内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况。

1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中。

2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素。

Eternal:缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds。

timeToIdleSeconds:缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除。

timeToLiveSeconds:缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大,即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除。

overflowToDisk:内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中),会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data。

diskPersistent:是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush方法。

diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔,默认是120秒。

diskSpoolBufferSizeMB:设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB

memoryStoreEvictionPolicy:内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存,共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)。

四:Java代码

package com.study.ehcache.test;

import java.util.HashMap;
import java.util.Map;

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

import org.junit.Test;

public class EhcacheStudy {

    @Test
    public void test1{
        
        //创建CacheManager
        CacheManager manager = CacheManager.create("src/ehcache.xml");  
        
        //默认制定src目录下的 ehcache.xml
        //CacheManager manager2 = CacheManager.create;  
        
        //创建一个Cache,名字和ehcache.xml里面制定的一致
        Cache cache = manager.getCache("studyCache"); 
        
        //创建Element,并且设置值
        Element e1 = new Element("key1","value1");
        Element e2 = new Element("key2","value2");
        
        //往缓存中插入值
        cache.put(e1);
        cache.put(e2);
        
        //输出结果
        System.out.println(cache.get("key1").getObjectValue);
        System.out.println(cache.get("key2").getObjectValue);
    }
    
    @Test
    public void test2{
        
        long startTime = System.currentTimeMillis;
        Map<String,Object> map = new HashMap<String,Object>;
        for(int i=1;i<=1000000;i++){
 String key = "key"+i;
 String value = "value"+i;
 map.put(key, value);
        }
        long endTime = System.currentTimeMillis;
        
        System.out.println(map.get("key500"));
        
        long excuteTime = endTime - startTime;
        System.out.println("excuteTime="+excuteTime);
    }
    
    @Test
    public void test3{
        
        long startTime = System.currentTimeMillis;
        CacheManager manager = CacheManager.create("src/ehcache.xml");  
        Cache cache = manager.getCache("studyCache"); 
        for(int i=1;i<=100000;i++){
 String key = "key"+i;
 String value = "value"+i;
 Element e = new Element(key,value);
 cache.put(e);
 System.out.println(key);
        }
        
        long endTime = System.currentTimeMillis;
        
        System.out.println(cache.get("key500").getObjectValue);
        
        long excuteTime = endTime - startTime;
        System.out.println("excuteTime="+excuteTime);
        
    }
}

1、test1是Ehcache 简单的用法介绍

2、test2是采用 Map 存储多数据测试,结果报内存溢出

3、test3是采用Ehcache 存储多数据测试,我们发现我们在Ehcache.xml 设置 maxElementsInMemory 参数为 1000,但是我们存储了100000 个数据同样能够读出来,因为我们设置了overflowToDisk=true,多余数据存储到了磁盘当中。

五:总结

如果是很少量数据的话我们当然用Map或者session等方式,但是存储数据有限,数据过多的话会内存溢出,而且会严重影响项目速度。

Ehcache存储数据的个数是通过设置Ehcache文件里面参数,我们可以存储很多数据,内存不够话,我们可以存储在磁盘上面。

以上代码和总结都是本人自己观点,如果发现错误或者有更好的解决方案希望大家多多指点,一起进步!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表