Ehcache轻量级缓存框架
????????Ehcache 是一个用于Java应用程序的开源的轻量级缓存框架。它专注于提供简单且高效的缓存解决方案,通过将数据存储在内存中,以提高对这些数据的访问速度。
1.为什么选择Ehcache
1.1 Ehcache(内存中缓存)的优缺点
优势:
-
性能:像Ehcache这样的内存中缓存速度很快,因为它将数据存储在应用程序的内存中。从内存中检索数据通常比从外部数据存储中获取数据更快。
-
简单性:Ehcache易于设置和配置,特别是在与Spring Boot一起使用时。它提供了一种在无需外部服务器的情况下缓存数据的简单方法。
-
紧密集成:由于在Spring中使用了
EhCacheCacheManager
,因此它与Spring框架的集成非常好。它是在Spring应用程序中进行缓存的无缝解决方案。 -
本地存储:数据存储在本地,减少了网络通信的需求。
考虑因素:
-
有限的可扩展性:内存中缓存受应用程序服务器上的可用内存限制。如果数据大小超出可用内存,可能会导致性能问题。
-
重新启动时的数据丢失:像Ehcache这样的缓存是在内存中的,因此在重新启动应用程序时会丢失数据。
1.2 Redis(分布式缓存)的优缺点
优势:
-
可扩展性:Redis是一种分布式缓存解决方案,更适合需要可扩展性的应用程序。它可以处理跨多个节点的较大数据集。
-
持久性:Redis支持数据持久性。您可以配置它定期将数据保存到磁盘或使用其他持久性机制。这确保了在重新启动期间不会丢失缓存的数据。
-
数据类型:Redis不仅仅是一个缓存;它还是一个数据存储。它支持各种数据结构,对于某些用例可能是有益的。
-
外部服务器:Redis可以作为单独的服务器运行,允许多个应用程序共享相同的缓存。
考虑因素:
-
网络开销:由于Redis是一个单独的服务器,与之交互时存在网络开销,这可能引入与内存解决方案相比的延迟。
-
配置和设置:设置和配置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;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!