在 Java 中,常用的本地缓存实现主要有以下几种,以下是它们的代码示例及适用场景:
一、使用 ConcurrentHashMap 实现简单缓存
适合轻量级、无需复杂淘汰策略的场景。
import java.util.concurrent.ConcurrentHashMap;
public class SimpleCache<K, V> {
private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();
public V get(K key) {
return cache.get(key);
}
public void put(K key, V value) {
cache.put(key, value);
}
public void remove(K key) {
cache.remove(key);
}
public void clear() {
cache.clear();
}
}
二、Guava Cache(推荐)
Google 提供的缓存库,支持过期策略、大小限制等。
2.1. 添加依赖(Maven):
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
2.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) {
// 创建缓存,设置最大容量100,写后1分钟过期
Cache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(100) // 最大条目数
.expireAfterWrite(1, TimeUnit.MINUTES) // 写入后过期时间
.build();
// 写入数据
cache.put("key1", "value1");
// 读取数据
String value = cache.getIfPresent("key1");
System.out.println("Value: " + value); // 输出 Value: value1
// 删除数据
cache.invalidate("key1");
}
}
三、Caffeine(高性能替代)
Guava Cache 的现代版,性能更高,推荐 Java 8+ 使用。
3.1. 添加依赖(Maven):
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.1.8</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 CaffeineCacheExample {
public static void main(String[] args) {
// 创建缓存,设置最大容量500,读后30秒过期
Cache<String, String> cache = Caffeine.newBuilder()
.maximumSize(500)
.expireAfterAccess(30, TimeUnit.SECONDS)
.build();
// 写入数据
cache.put("key1", "value1");
// 读取数据(若不存在则返回null)
String value = cache.getIfPresent("key1");
System.out.println("Value: " + value); // 输出 Value: value1
// 删除数据
cache.invalidate("key1");
}
}
四、Ehcache(支持持久化)
功能更强大,支持磁盘持久化、分布式缓存等。
4.1. 添加依赖(Maven):
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.10.8</version>
</dependency>
4.2. 代码示例:
java
Copy Code
import org.ehcache.Cache;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.config.units.MemoryUnit;
import org.ehcache.core.config.DefaultConfiguration;
import org.ehcache.core.spi.service.LocalPersistenceService;
import org.ehcache.impl.config.persistence.DefaultPersistenceConfiguration;
import org.ehcache.impl.persistence.DefaultLocalPersistenceService;
public class EhcacheExample {
public static void main(String[] args) {
// 配置持久化到磁盘
LocalPersistenceService persistenceService = new DefaultLocalPersistenceService(
new DefaultPersistenceConfiguration(new File("cache-data")));
// 创建缓存管理器
DefaultConfiguration config = new DefaultConfiguration(
persistenceService, ResourcePoolsBuilder.heap(100).build());
Cache<String, String> cache = CacheConfigurationBuilder.newCacheConfigurationBuilder(
String.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(100, MemoryUnit.MB) // 堆内内存
.disk(1, MemoryUnit.GB) // 磁盘持久化
).buildConfig(String.class);
// 写入数据
cache.put("key1", "value1");
// 读取数据
String value = cache.get("key1");
System.out.println("Value: " + value); // 输出 Value: value1
// 关闭资源
persistenceService.close();
}
}
五、缓存选择建议
场景 推荐方案 优势
简单键值对、无过期策略 ConcurrentHashMap 无依赖,轻量级
需要淘汰策略、过期时间 Guava Cache / Caffeine 功能丰富,易集成
大数据量、高性能需求 Caffeine 高吞吐量,低延迟
需要持久化到磁盘 Ehcache 支持磁盘存储,适合重启恢复数据
六、注意事项
缓存一致性:
如果数据源更新频繁,需通过 invalidate 手动清除旧缓存或设置短过期时间。
内存管理:
设置合理的 maximumSize 或 expireAfterWrite,避免内存溢出(OOM)。
并发安全:
Guava/Caffeine/Ehcache 均为线程安全,直接使用即可。