请关注微信公众号:拾荒的小海螺
博客地址:http://lsk-ww.cn/
1、简述
在现代应用程序中,缓存技术是提升系统性能和用户体验的重要手段之一。与分布式缓存不同,本地缓存直接存储在应用服务器的内存中,具有更低的延迟和更高的访问速度。本文将介绍Java中常见的本地缓存技术,并提供一些实际的样例代码。
2、EHCache
EHCache是一个强大且简单易用的开源Java分布式缓存。它提供了丰富的功能,包括内存缓存和磁盘缓存、缓存复制、持久化等。
- 优点:易于使用、功能丰富、支持分布式缓存。
- 缺点:配置较为复杂,占用更多资源。
2.1 引入依赖
在Maven项目中添加以下依赖:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.9.2</version>
</dependency>
2.2 配置EHCache
创建一个ehcache.xml配置文件:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<cache name="testCache"
maxEntriesLocalHeap="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
diskSpoolBufferSizeMB="20"
maxEntriesLocalDisk="1000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"
statistics="true"/>
</ehcache>
2.3 样例
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
public class EHCacheExample {
public static void main(String[] args) {
CacheManager cacheManager = CacheManager.newInstance("ehcache.xml");
Cache cache = cacheManager.getCache("testCache");
cache.put(new Element("key", "value"));
Element element = cache.get("key");
if (element != null) {
System.out.println("Value: " + element.getObjectValue());
}
cacheManager.shutdown();
}
}
3、Caffeine
Caffeine是一个高性能的Java缓存库,灵感来源于Google Guava Cache,但性能更高。它提供了良好的并发支持和高效的缓存管理策略。
- 优点:高性能、支持多种缓存失效策略。
- 缺点:缺乏分布式缓存功能。
3.1 引入依赖
在Maven项目中添加以下依赖:
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.0.5</version>
</dependency>
3.2 样例
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;
public class CaffeineExample {
public static void main(String[] args) {
Cache<String, String> cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(100)
.build();
cache.put("key", "value");
String value = cache.getIfPresent("key");
System.out.println("Value: " + value);
}
}
4、Guava Cache
Guava是Google提供的一组核心库,其中包括一个简单易用的本地缓存实现。它支持缓存的自动回收和失效机制。
- 优点:简单易用、与Guava的其他功能无缝集成。
- 缺点:性能和功能相对较弱。
4.1 引入依赖
在Maven项目中添加以下依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
4.2 样例
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;
public class GuavaCacheExample {
public static void main(String[] args) {
Cache<String, String> cache = CacheBuilder.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(100)
.build();
cache.put("key", "value");
String value = cache.getIfPresent("key");
System.out.println("Value: " + value);
}
}
5、Java Caching System (JCS)
JCS是一个功能丰富的Java缓存系统,支持多种缓存管理策略,具有较高的可配置性和扩展性。
-
优点:功能丰富、支持多种缓存策略、灵活的配置选项。
-
缺点:较复杂的配置和使用。
5.1 引入依赖
在Maven项目中添加以下依赖:
<dependency>
<groupId>org.apache.jcs</groupId>
<artifactId>jcs</artifactId>
<version>2.2.1</version>
</dependency>
5.2 样例
import org.apache.jcs.JCS;
import org.apache.jcs.access.exception.CacheException;
public class JCSExample {
public static void main(String[] args) {
try {
JCS cache = JCS.getInstance("default");
cache.put("key", "value");
String value = (String) cache.get("key");
System.out.println("Value: " + value);
} catch (CacheException e) {
e.printStackTrace();
}
}
}
6、Apache Ignite
Apache Ignite是一个分布式数据库和计算平台,但它也可以作为一个高性能的本地缓存来使用,支持持久化、SQL查询、计算等功能。
-
优点:高性能、支持分布式、持久化和多种数据访问方式。
-
缺点:相对复杂,学习曲线较陡。
6.1 引入依赖
在Maven项目中添加以下依赖:
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version>2.14.0</version>
</dependency>
6.2 样例
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
public class IgniteExample {
public static void main(String[] args) {
IgniteConfiguration cfg = new IgniteConfiguration();
try (Ignite ignite = Ignition.start(cfg)) {
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCache");
cache.put(1, "value");
String value = cache.get(1);
System.out.println("Value: " + value);
}
}
}
7、Infinispan
Infinispan是一个分布式缓存和Key-Value数据存储平台,提供了强大的数据存储和缓存功能,可以嵌入在Java应用中,也可以作为独立的服务器运行。
-
优点:高性能、支持分布式、丰富的功能和配置选项。
-
缺点:相对复杂,配置较为繁琐。
7.1 引入依赖
在Maven项目中添加以下依赖:
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version>2.14.0</version>
</dependency>
7.2 样例
import org.infinispan.Cache;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.DefaultCacheManager;
public class InfinispanExample {
public static void main(String[] args) {
DefaultCacheManager cacheManager = new DefaultCacheManager();
cacheManager.defineConfiguration("local", new ConfigurationBuilder().build());
Cache<String, String> cache = cacheManager.getCache("local");
cache.put("key", "value");
String value = cache.get("key");
System.out.println("Value: " + value);
cacheManager.stop();
}
}
8、MapDB
MapDB是一个嵌入式数据库和缓存库,提供了简单、高效的内存和磁盘存储,适用于各种Java应用。
-
优点:高性能、简单易用、支持内存和磁盘存储。
-
缺点:功能较少,适用于简单缓存需求。
8.1 引入依赖
在Maven项目中添加以下依赖:
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.0.9</version>
</dependency>
8.2 样例
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.HTreeMap;
public class MapDBExample {
public static void main(String[] args) {
DB db = DBMaker.memoryDB().make();
HTreeMap<String, String> map = db.hashMap("map").createOrOpen();
map.put("key", "value");
String value = map.get("key");
System.out.println("Value: " + value);
db.close();
}
}
9、ExpiringMap
ExpiringMap是一个简单的Java缓存库,提供了基于时间的键值对缓存,适用于轻量级缓存需求。
-
优点:简单轻量、易于集成。
-
缺点:功能有限,仅适用于简单的缓存需求。
9.1 引入依赖
在Maven项目中添加以下依赖:
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
<version>0.5.9</version>
</dependency>
9.2 样例
import net.jodah.expiringmap.ExpiringMap;
import java.util.concurrent.TimeUnit;
public class ExpiringMapExample {
public static void main(String[] args) {
ExpiringMap<String, String> map = ExpiringMap.builder()
.expiration(10, TimeUnit.MINUTES)
.build();
map.put("key", "value");
String value = map.get("key");
System.out.println("Value: " + value);
}
}
10、总结
本地缓存是提升应用程序性能的有效手段。在Java中,EHCache、Caffeine、Guava Cache、JCS、Apache Ignite、Infinispan、MapDB和ExpiringMap是常见的本地缓存实现,各有优缺点和适用场景。选择合适的缓存方案,可以显著提升系统的响应速度和处理能力。在实际应用中,需要根据具体需求和系统架构,合理配置和使用缓存,以实现最佳的性能优化效果。