什么是Caffeine?
Caffeine是一个用Java编写的高性能缓存库,专为满足现代速度和效率需求而设计。它提供内存缓存,支持异步操作、基于时间或大小的自动条目淘汰,以及可自定义的驱逐策略(例如基于使用频率)。该库完全兼容Java 8及以上版本,并广泛应用于大型项目中,例如Spring Framework(通过Spring Cache)。
为什么需要它?
缓存可以减少数据访问时间,降低数据库或外部API的负载,并提高应用程序的响应能力。Caffeine以最小的开销解决这些问题:它提供亚微秒级的读写延迟,自动管理内存,并允许根据特定业务需求灵活配置缓存。如果没有它,您将不得不使用HashMap和定时器手动实现缓存,这既复杂又不可靠。
安装
将依赖项添加到您的pom.xml文件(Maven)中:
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.1.8</version></dependency>对于Gradle:
implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'主要功能
- 自动淘汰:根据生存时间(expireAfterWrite, expireAfterAccess)或大小(maximumSize, maximumWeight)删除条目。
- 异步加载:通过AsyncCache或支持CompletableFuture的loadingCache方法实现。
- 统计信息:收集指标(命中率、未命中率、驱逐次数)用于监控。
- 驱逐策略:默认使用Window TinyLFU(一种接近最优的自适应算法)。
- Null安全性:正确处理null值。
Java代码示例
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) .recordStats() .build();
// 写入缓存 cache.put("user:123", "Alice");
// 读取并自动加载 String user = cache.get("user:456", key -> fetchFromDatabase(key)); System.out.println(user); // null 或 fetch 的结果
// 统计信息 System.out.println(cache.stats().hitRate()); }
private static String fetchFromDatabase(String key) { return "Bob"; // 模拟数据库查询 }}何时使用
Caffeine非常适合缓存API调用结果、数据库数据、计算结果或任何执行频繁且成本高昂的操作。在Web应用程序、微服务、ETL流程或任何需要快速可靠缓存的Java项目中使用它。如果您需要分布式缓存,请避免使用Caffeine(此时请考虑Redis或Hazelcast)。