????????Ehcache 是一个用于Java应用程序的开源的轻量级缓存框架。它专注于提供简单且高效的缓存解决方案,通过将数据存储在内存中,以提高对这些数据的访问速度。
优势:
性能:像Ehcache这样的内存中缓存速度很快,因为它将数据存储在应用程序的内存中。从内存中检索数据通常比从外部数据存储中获取数据更快。
简单性:Ehcache易于设置和配置,特别是在与Spring Boot一起使用时。它提供了一种在无需外部服务器的情况下缓存数据的简单方法。
紧密集成:由于在Spring中使用了EhCacheCacheManager
,因此它与Spring框架的集成非常好。它是在Spring应用程序中进行缓存的无缝解决方案。
本地存储:数据存储在本地,减少了网络通信的需求。
考虑因素:
有限的可扩展性:内存中缓存受应用程序服务器上的可用内存限制。如果数据大小超出可用内存,可能会导致性能问题。
重新启动时的数据丢失:像Ehcache这样的缓存是在内存中的,因此在重新启动应用程序时会丢失数据。
优势:
可扩展性:Redis是一种分布式缓存解决方案,更适合需要可扩展性的应用程序。它可以处理跨多个节点的较大数据集。
持久性:Redis支持数据持久性。您可以配置它定期将数据保存到磁盘或使用其他持久性机制。这确保了在重新启动期间不会丢失缓存的数据。
数据类型:Redis不仅仅是一个缓存;它还是一个数据存储。它支持各种数据结构,对于某些用例可能是有益的。
外部服务器:Redis可以作为单独的服务器运行,允许多个应用程序共享相同的缓存。
考虑因素:
网络开销:由于Redis是一个单独的服务器,与之交互时存在网络开销,这可能引入与内存解决方案相比的延迟。
配置和设置:设置和配置Redis可能需要比内存解决方案更多的工作。
????????如果你的应用程序数据规模适中且不需要分布式缓存或持久性,Ehcache可能是一个更简单和性能更好的解决方案。如果需要分布式缓存、可扩展性和数据持久性,那么Redis可能更适合。
<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>
? ? ? ? 创建一个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>
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);
}
}
CacheUtils.put(cacheName, token, list, 60*60, 60*60); // 设置缓存过期时间,可以根据需要设置
String cacheName = "xxx"; // 设置缓存名称
Object cachedResult = CacheUtils.get(cacheName, token);
if (cachedResult != null) {
// 缓存命中,直接返回缓存结果
list = (List<XXX>) cachedResult;
}