百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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

csdh11 2025-05-03 13:16 2 浏览

一: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文件里面参数,我们可以存储很多数据,内存不够话,我们可以存储在磁盘上面。

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

相关推荐

Github霸榜的SpringBoot全套学习教程,从入门到实战,内容超详细

前言...

SpringBoot+LayUI后台管理系统开发脚手架

源码获取方式:关注,转发之后私信回复【源码】即可免费获取到!项目简介本项目本着避免重复造轮子的原则,建立一套快速开发JavaWEB项目(springboot-mini),能满足大部分后台管理系统基础开...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础...

探秘Spring Cache:让Java应用飞起来的秘密武器

探秘SpringCache:让Java应用飞起来的秘密武器在当今快节奏的软件开发环境中,性能优化显得尤为重要。SpringCache作为Spring框架的一部分,为我们提供了强大的缓存管理能力,让...

3,从零开始搭建SSHM开发框架(集成Spring MVC)

目录本专题博客已共享在(这个可能会更新的稍微一些)https://code.csdn.net/yangwei19680827/maven_sshm_blog...

Spring Boot中如何使用缓存?超简单

SpringBoot中的缓存可以减少从数据库重复获取数据或执行昂贵计算的需要,从而显著提高应用程序的性能。SpringBoot提供了与各种缓存提供程序的集成,您可以在应用程序中轻松配置和使用缓...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

1,从零开始搭建SSHM开发框架(环境准备)

目录本专题博客已共享在https://code.csdn.net/yangwei19680827/maven_sshm_blog1,从零开始搭建SSHM开发框架(环境准备)...

做一个适合二次开发的低代码平台,把程序员从curd中解脱出来-1

干程序员也有好长时间了,大多数时间都是在做curd。现在想做一个通用的curd平台直接将我们解放出来;把核心放在业务处理中。用过代码生成器,在数据表设计好之后使用它就可以生成需要的controller...

设计一个高性能Java Web框架(java做网站的框架)

设计一个高性能JavaWeb框架在当今互联网高速发展的时代,构建高性能的JavaWeb框架对于提升用户体验至关重要。本文将从多个角度探讨如何设计这样一个框架,让我们一起进入这段充满挑战和乐趣的旅程...

【推荐】强&amp;牛!一款开源免费的功能强大的代码生成器系统!

今天,给大家推荐一个代码生成器系统项目,这个项目目前收获了5.3KStar,个人觉得不错,值得拿出来和大家分享下。这是我目前见过最好的代码生成器系统项目。功能完整,代码结构清晰。...

Java面试题及答案总结(2025版持续更新)

大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试场景题及答案。...

Java开发网站架构演变过程-从单体应用到微服务架构详解

Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构、集群架构、分布式架构、SOA架构和微服务架构。下面玄武老师来给大家详细介绍下这5种架构模式的发展背景、各自优缺点以及涉及到的...

本地缓存GuavaCache(一)(guava本地缓存原理)

在并发量、吞吐量越来越大的情况下往往是离不开缓存的,使用缓存能减轻数据库的压力,临时存储数据。根据不同的场景选择不同的缓存,分布式缓存有Redis,Memcached、Tair、EVCache、Aer...