Ehcache轻量级缓存框架

发布时间:2024年01月08日

????????Ehcache 是一个用于Java应用程序的开源的轻量级缓存框架。它专注于提供简单且高效的缓存解决方案,通过将数据存储在内存中,以提高对这些数据的访问速度。

1.为什么选择Ehcache

1.1 Ehcache(内存中缓存)的优缺点

优势:

  1. 性能:像Ehcache这样的内存中缓存速度很快,因为它将数据存储在应用程序的内存中。从内存中检索数据通常比从外部数据存储中获取数据更快。

  2. 简单性:Ehcache易于设置和配置,特别是在与Spring Boot一起使用时。它提供了一种在无需外部服务器的情况下缓存数据的简单方法。

  3. 紧密集成:由于在Spring中使用了EhCacheCacheManager,因此它与Spring框架的集成非常好。它是在Spring应用程序中进行缓存的无缝解决方案。

  4. 本地存储:数据存储在本地,减少了网络通信的需求。

考虑因素:

  1. 有限的可扩展性:内存中缓存受应用程序服务器上的可用内存限制。如果数据大小超出可用内存,可能会导致性能问题。

  2. 重新启动时的数据丢失:像Ehcache这样的缓存是在内存中的,因此在重新启动应用程序时会丢失数据。

1.2 Redis(分布式缓存)的优缺点

优势:

  1. 可扩展性:Redis是一种分布式缓存解决方案,更适合需要可扩展性的应用程序。它可以处理跨多个节点的较大数据集。

  2. 持久性:Redis支持数据持久性。您可以配置它定期将数据保存到磁盘或使用其他持久性机制。这确保了在重新启动期间不会丢失缓存的数据。

  3. 数据类型:Redis不仅仅是一个缓存;它还是一个数据存储。它支持各种数据结构,对于某些用例可能是有益的。

  4. 外部服务器:Redis可以作为单独的服务器运行,允许多个应用程序共享相同的缓存。

考虑因素:

  1. 网络开销:由于Redis是一个单独的服务器,与之交互时存在网络开销,这可能引入与内存解决方案相比的延迟。

  2. 配置和设置:设置和配置Redis可能需要比内存解决方案更多的工作。

结论:

????????如果你的应用程序数据规模适中且不需要分布式缓存或持久性,Ehcache可能是一个更简单和性能更好的解决方案。如果需要分布式缓存、可扩展性和数据持久性,那么Redis可能更适合。

2.Ehcache的使用

2.1 添加依赖

<dependency>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
????????<groupId>net.sf.ehcache</groupId>
????????<artifactId>ehcache</artifactId>
????????<version>2.10.7</version>
</dependency>

2.2 配置Ehcache

? ? ? ? 创建一个ehcache.xml文件,放到类路径下

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <defaultCache maxElementsInMemory="1000"
                  overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="3600"
                  timeToLiveSeconds="3600" memoryStoreEvictionPolicy="LRU"/>
    <cache name="5s" maxElementsInMemory="100"
           overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="5" timeToLiveSeconds="5"
           memoryStoreEvictionPolicy="LRU"/>
</ehcache>
  • 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:内存数量最大时是否清除。

2.3 创建Ehcache工具类

package com.liaowang.intelligent.common.cache;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;

@Configuration
public class CacheUtils {
    private static CacheManager manager;


    @Resource
    public void setManager(CacheManager manager) {
        CacheUtils.manager = manager;
    }

    public static Object get(String cacheName, Object key) {
        Element e= cache(cacheName).get(key);
        if(e!=null){
            return e.getObjectValue();
        }
        return null;
    }

    public static void put(String cacheName, Object key, Object value, Integer ttl, Integer tti) {
        Element e = new Element(key, value);
        //不设置则使用xml配置
        if (ttl != null) {
            e.setTimeToLive(ttl);
        }
        if (tti != null) {
            e.setTimeToIdle(tti);
        }
        cache(cacheName).put(e);
    }


    private static Cache cache(String cacheName) {
        net.sf.ehcache.CacheManager cacheManager = ((EhCacheCacheManager) manager).getCacheManager();
        if (!cacheManager.cacheExists(cacheName)) {
            cacheManager.addCache(cacheName);
        }
        return cacheManager.getCache(cacheName);
    }

}

2.4 类中使用EhCache

2.4.1 存放cache

CacheUtils.put(cacheName, token, list, 60*60, 60*60); // 设置缓存过期时间,可以根据需要设置

2.4.2?获取cache

String cacheName = "xxx"; // 设置缓存名称
Object cachedResult = CacheUtils.get(cacheName, token);
if (cachedResult != null) {
    // 缓存命中,直接返回缓存结果
    list = (List<XXX>) cachedResult;
}
文章来源:https://blog.csdn.net/LB_bei/article/details/135454871
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。