Caffeine 是一个高性能的Java缓存库,提供了近乎最佳的命中率和优秀的并发性能。被设计用来替代诸如Guava Cache等其他Java缓存解决方案,并引入了W-TinyLFU算法来提高缓存命中率。
关键特性
- 高命中率:通过采用最新的缓存淘汰算法(如W-TinyLFU),提供更高的缓存命中率。
- 低延迟:优化了缓存访问速度,确保快速的数据获取。
- 扩展性好:支持异步加载、手动加载、自动加载等多种数据加载方式。
- 丰富的过期策略:可以根据访问时间、写入时间或者自定义条件进行数据过期处理。
- 内存敏感:能够根据系统可用内存动态调整缓存大小。
使用示例
- 添加依赖
首先,在pom.xml中添加Caffeine依赖:
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.0.5</version>
</dependency>
- 基本用法
创建一个缓存实例并使用它来存储和检索值
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) {
// 创建一个缓存,设置最大容量为100,数据在写入后10分钟过期
Cache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(100)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
// 向缓存中放入数据
cache.put("key", "value");
// 从缓存中获取数据
String value = (String) cache.getIfPresent("key");
System.out.println("Value: " + value);
// 可以使用get方法配合CacheLoader来实现自动加载缺失的数据
}
}
- 异步缓存
Caffeine还支持异步缓存操作,允许以非阻塞的方式获取缓存值
import com.github.benmanes.caffeine.cache.AsyncLoadingCache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class AsyncCaffeineExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
AsyncLoadingCache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(100)
.buildAsync();
CompletableFuture<Object> future = cache.get("key", k -> "value");
System.out.println("Future Value: " + future.get());
}
}
适用场景
- 高频访问数据缓存
- 电商系统中的热门商品信息、实时排行榜等,利用Caffeine的高吞吐量,快速响应请求,降低后端数据库压力。
- 用户登录状态、购物车信息等实时性要求高的短期数据,通过本地缓存实现微秒级读取延迟。
- 多级缓存架构本地层
- 与Redis等分布式缓存协同,形成“本地缓存+远程缓存”多级结构,优先从Caffeine读取数据,减少网络I/O开销。
- 通过本地缓存拦截高频重复请求,避免分布式缓存被击穿,提升系统抗突发流量能力(如秒杀场景)。
- 低频变更数据存储
- 系统参数、枚举值、类目信息等变更频率低的数据,通过Caffeine缓存减少重复计算和数据库查询。
- 外部API返回的键值对数据(如地理位置映射、汇率信息),通过本地缓存降低调用频率与响应延迟。
- 特定性能优化场景
- 支持refreshAfterWrite配置,后台异步刷新数据,避免缓存过期时请求阻塞,适用于数据更新周期固定的场景。
- 通过弱引用/软引用自动回收机制,在内存不足时优先释放非关键数据,平衡性能与资源消耗。
- 开发便捷性需求
- Spring Boot通过@Cacheable注解无缝集成,5分钟内可完成基础缓存功能搭建,适合中小型项目快速落地。
- 支持按时间(创建/访问时间)、容量、权重等多维度设置淘汰策略,适配不同业务特征。
总结
Caffeine因其卓越的性能和灵活的配置选项以及智能淘汰算法,已经成为了现代Java应用程序中实现高效缓存的一个优选方案。无论是构建需要高速读写的本地缓存,还是希望提升应用的整体性能,以及应对高并发、低延迟需求的本地缓存场景,Caffeine都是一个不错的选择。