`

本地缓存Ehcache

 
阅读更多

一、什么是ehcache?

在互联网应用中,数据存储和访问通常有两个地方:DB和缓存。

1. 各自的优缺点:DB属于持久化存储,缓存属于非持久化存储(有过期时间);缓存相对DB来说,插入和访问的速度要快很多。其中缓存又分为本地缓存(例如ehcache)和网络缓存(例如redis)。

 

2. 它们三者的访问速度比较:ehcache > redis > DB。

ehcache的特点是缓存容量小,但是存取速度快(没有网络传输消耗);redis缓存容量大,存取速度次之(因为redis缓存服务器通常单独部署在应用主机以外);DB存取速度最慢。

 

3. ehcache作为本地缓存,是可以共用的,即一个地方存,另一个地方可以直接使用。

使用流程一般是:先从本地缓存ehcache中取,取不到再从网络缓存redis里取,再取不到就从DB里取,中间每一步如果取到了,就将值set到对应的存储容器里,以便下次就可以直接获取到。

 

二、ehcache的使用方法:

1.现在pom.xml里加入ehcache的坐标:

<dependency>

<groupId>net.sf.ehcache</groupId>

<artifactId>ehcache-core</artifactId>

<version>2.6.10</version>

</dependency>

 

2.在src目录下添加一个ehcache的配置文件:ehcache.xml

此配置文件就是ehcache的使用策略配置

<defaultCache

   maxEntriesLocalHeap="1000000"

   eternal="false"

   timeToIdleSeconds="60"

   timeToLiveSeconds="120"

   diskSpoolBufferSizeMB="128"

   maxEntriesLocalDisk="10000000"

   diskExpiryThreadIntervalSeconds="120"

   memoryStoreEvictionPolicy="LRU">

<persistence strategy="localTempSwap"/>

</defaultCache>

<cache name="ESBController"

   maxEntriesLocalHeap="1000000"

   eternal="false"

   timeToIdleSeconds="60"

   timeToLiveSeconds="120"

   diskSpoolBufferSizeMB="128"

   maxEntriesLocalDisk="10000000"

   diskExpiryThreadIntervalSeconds="120"

   memoryStoreEvictionPolicy="LRU">

<persistence strategy="localTempSwap"/>

</cache>

参数介绍:

http://zzy603.iteye.com/blog/1153100

<?xml version="1.0" encoding="UTF-8"?> 

<ehcache> 

<!--timeToIdleSeconds 当缓存闲置n秒后销毁 --> 

<!--timeToLiveSeconds 当缓存存活n秒后销毁 --> 

<!-- 

缓存配置 

       name:缓存名称。 

       maxElementsInMemory:缓存最大个数。 

       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:内存数量最大时是否清除。 

--> 

 

3. 创建一个ehcache的api工具类:

public class EhcacheUtil {

 

private static URL url = EhcacheUtil.class.getClass().getResource("/ehcache.xml");

private static CacheManager manager = new CacheManager(url);

 

private EhcacheUtil() {

    }

 

    private static class EhcacheUtilHolder {

        /**

         * 静态初始化器,由JVM来保证线程安全

         */

        private static EhcacheUtil instance = new EhcacheUtil();

    }

 

    public static EhcacheUtil getInstance() {

        return EhcacheUtilHolder.instance;

    }

 

/**

* 添加指定名称的cache

* @param cacheName

*/

public static void addCache(String cacheName){

EhcacheUtil.manager.addCache(cacheName);

}

 

/**

* 获取指定名称的cache

* @param cacheName

*/

public static Cache getCache(String cacheName){

return EhcacheUtil.manager.getCache(cacheName);

}

 

/**

* 往指定名称的cache里添加元素

* @param cacheName

* @param element

*/

public static void putElement(String cacheName, Element element){

EhcacheUtil.getCache(cacheName).put(element);

}

 

/**

* 往指定名称的cache里添加key和value

* @param cacheName

* @param key

* @param value

*/

public static void putElement(String cacheName, Object key, Object value){

if(EhcacheUtil.getCache(cacheName) == null){

EhcacheUtil.addCache(cacheName);

}

Element element = new Element(key, value);

EhcacheUtil.getCache(cacheName).put(element);

}

 

/**

* 获取指定名称的cache里的指定key对应的元素

* @param cacheName

* @param key

* @return 元素

*/

public static Element getElementByKey(String cacheName, String key){

if(EhcacheUtil.getCache(cacheName) == null){

EhcacheUtil.addCache(cacheName);

}

return EhcacheUtil.getCache(cacheName).get(key);

}

 

/**

* 获取指定名称的cache里的指定key对应的value

* @param cacheName

* @param key

* @return 元素value

*/

public static Object getValueByKey(String cacheName, String key){

if(EhcacheUtil.getCache(cacheName) == null){

EhcacheUtil.addCache(cacheName);

}

Element element = EhcacheUtil.getCache(cacheName).get(key);

if(element != null) {

return element.getObjectValue();

}

return null;

}

 

/**

* flush cache

*/

public static void clear(String cacheName){

if(EhcacheUtil.getCache(cacheName) == null){

return;

}

EhcacheUtil.getCache(cacheName).flush();

}

 

/**

* 测试

* @param args

*/

public static void main(String [] args) {

String cacheName = "testCache";

 

// 添加cache

EhcacheUtil.addCache(cacheName);

 

// 获取cache

Cache cache = EhcacheUtil.getCache(cacheName);

 

// put元素

Element element1 = new Element("id", "14073034");

cache.put(element1);

Element element2 = new Element("name", "guweiqiang");

cache.put(element2);

 

// get元素

Element element11 = EhcacheUtil.getElementByKey("testCache", "id");

Object value11 = element11.getObjectValue();

if(value11 != null) {

System.out.println("value11:" + value11.toString());

}

 

// 清除cache

EhcacheUtil.clear(cacheName);

 

// get元素

Object value12 = EhcacheUtil.getValueByKey(cacheName, "name");

if(value12 != null) {

System.out.println("value12:" + value12.toString());

}

}

}

 

在使用它的地方:

        ActivityDto activity = null;

        activity = (ActivityDto) EhcacheUtil.getValueByKey(ConstantUtil.ACTIVITY_EHCACHE_NAME, ConstantUtil.ACTIVITY_EHCACHE_KEY);

        if (activity == null) {

            synchronized (ActivityDto.class) {

                if (activity == null) {

                    ResponseDTO<ActivityDto> activityRes = activityService.getActivity();

                    if (activityRes.getMessage().isSuccess() && activityRes.getResult() != null) {

                        activity = activityRes.getResult();

                        EhcacheUtil.putElement(ConstantUtil.ACTIVITY_EHCACHE_NAME, ConstantUtil.ACTIVITY_EHCACHE_KEY, activity);

                    }

                }

            }

        }

 

分享到:
评论

相关推荐

    spring-ehcache-redis两级缓存

    两级缓存在redis的方案上做一步优化,在缓存到远程redis的同时,缓存一份到本地进程ehcache(此处的ehcache不用做集群,避免组播带来的开销),取缓存...get开销只要一次,后续不需要了,除非本地缓存过期需要再get。)

    spring + ehcache + redis两级缓存

    当我们谈论“Spring + Ehcache + Redis”两级缓存时,我们实际上是在讨论如何在Java环境中利用Spring框架来集成Ehcache作为本地缓存,并利用Redis作为分布式二级缓存,构建一个高效且可扩展的缓存解决方案。...

    ehcache缓存配置详解

    ehcache 缓存配置详解 Ehcache 是一个流行的 Java 缓存框架,提供了强大的缓存机制,帮助开发者提高应用程序的性能和可扩展性。 Ehcache 的配置主要包括 diskstore、defaultCache、cache 三个部分,这三个部分的...

    cache/ehcache缓存使用

    Ehcache支持本地缓存和分布式缓存,可以方便地集成到Spring、Hibernate等框架中。其核心特性包括内存和磁盘存储、缓存过期策略、缓存分区、缓存预热等。 在Java应用中,我们可以使用Ehcache进行对象的存储和读取。...

    缓存框架-Ehcache学习笔记

    Ehcache 提供了本地内存缓存、磁盘存储以及分布式缓存的能力,使得应用程序能够快速访问频繁使用的数据,从而提高整体性能和响应速度。 ### 1. Ehcache 基本概念 - **Cache**: 缓存是存储数据的临时区域,用于快速...

    本地缓存(一)ehcache/jcs/cache4j/jcs的性能测试与使用场景分析

    本文将主要探讨本地缓存的几个常见实现,包括Ehcache、JCS(Java Caching System)和Cache4j,并进行性能测试,同时分析它们各自适用的使用场景。 首先,Ehcache是一个广泛使用的开源Java缓存解决方案,它提供了...

    J2Cache.pdf

    - 当数据发生变化时,首先清除本地缓存Ehcache中的数据。 - 然后清除分布式缓存Redis中的数据。 - 最后,通过JGroups发送组播命令通知集群中的其他节点清除相应的缓存。 #### 细节解析 - **Ehcache缓存自动失效...

    Spring Boot的EhCache缓存使用.docx

    这里配置了一个名为“users”的缓存,最大本地堆内存条目为100,不溢出到磁盘。 3. **启用EhCache**: 在Spring Boot的主配置类上添加`@EnableCaching`注解,并通过`spring.cache.type=ehcache`属性指定使用...

    集群环境中使用_EhCache_缓存系统&Ehcache配置文件的详细说明

    EhCache是由Terracotta公司开发的内存缓存系统,它支持本地缓存和分布式缓存两种模式。EhCache的特点包括:快速存取、内存管理、支持持久化和缓存过期策略等。在集群环境中,EhCache通过RMI(远程方法调用)或...

    java源码:ehcache(Java缓存框架 EhCache).rar

    EhCache是基于内存的缓存解决方案,支持本地和分布式缓存。 2. **核心组件**: - **Cache**:是最基本的缓存单元,它包含一组键值对(key-value)。 - **Element**:是Cache中的一个元素,包含一个键和一个值,...

    开源缓存包 EHCache 全接触

    - **微服务架构**:为微服务提供本地缓存,减少跨服务通信。 总结,EHCache 是一个强大且灵活的缓存解决方案,它的高效性、易用性和可扩展性使其成为 Java 开发者的首选。通过深入理解其原理和最佳实践,我们可以更...

    配置EhCache二级缓存

    它支持多种缓存模型,包括本地缓存和分布式缓存。由于其简单易用且功能强大,EhCache 成为了 Java 应用程序中常用的缓存解决方案之一。特别是对于单机应用而言,EhCache 是一个理想的二级缓存选择。在Hibernate框架...

    Ehcache 整合Spring 使用页面、对象缓存

    Ehcache不仅支持本地缓存,还支持分布式缓存,并且能够与Spring等主流框架无缝集成。Ehcache的特点包括: - **多级缓存支持**:支持内存和磁盘两种存储方式,可以根据不同的场景选择合适的缓存级别。 - **灵活的...

    高并发缓存器(基于ehcache)

    Ehcache支持本地缓存、分布式缓存和 terracotta 集群模式,广泛应用于Java Web应用和企业级系统中。其主要特性包括: 1. **内存和磁盘存储**:Ehcache允许将数据存储在内存中,当内存不足时,可以自动将部分数据...

    基于JGROUPS的ehcache的分布式缓存复制

    首先,Ehcache是一个开源的、高性能的Java缓存库,提供本地缓存以及分布式缓存功能。它支持多种缓存策略,如LRU(Least Recently Used)最近最少使用、LFU(Least Frequently Used)最不常用,以及定时过期等。...

    jboss集成 ehcache 快捷部署缓存

    Ehcache则是一款广泛使用的Java缓存解决方案,它可以提供本地内存缓存以及分布式缓存的能力,有效地减少数据库的访问压力,提高系统的响应速度。 首先,我们需要了解ehcache的基本概念和工作原理。Ehcache分为两级...

    EhCache缓存

    EhCache是一个高性能、易用的Java本地缓存框架,被广泛应用于许多Java应用程序中,包括MyBatis这种流行的持久层框架。MyBatis利用EhCache作为其二级缓存机制,来提升数据访问的效率。 在MyBatis中,缓存分为一级...

    基于Java的ehcache(Java缓存框架 EhCache).zip

    EhCache作为开源的内存缓存解决方案,提供了本地缓存、分布式缓存以及对数据库查询结果的缓存等功能。 EhCache的核心概念主要包括缓存、缓存管理器、缓存区域和缓存项。 1. **缓存**:缓存是存储数据的地方,它以...

    ehcache缓存

    Ehcache是一个开源的、广泛使用的Java缓存解决方案,它为高性能应用程序提供了本地内存缓存功能。在Java世界中,Ehcache被设计用来提高数据访问速度,减少数据库负载,从而提升整体应用性能。本文将深入探讨Ehcache...

Global site tag (gtag.js) - Google Analytics