高性能Java缓存库,专注于提供快速、高效的本地缓存解决方案。本文将深入探讨Caffeine的一些关键特性、用法和性能优化。基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。
缓存和ConcurrentMap有点相似,但有区别。最根本的区别是ConcurrentMap将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但Caffeine的缓存Cache 通常会被配置成自动驱逐缓存中元素,以限制其内存占用。在某些场景下,LoadingCache和AsyncLoadingCache 因为其自动加载缓存的能力将会变得非常实用。
和 redis 一样,默认都是被动淘汰,毕竟主动淘汰就有额外性能开销。
灵活构造器创建拥有下列特性的缓存:
- 自动加载元素到缓存当中,异步加载也可选
- 当达到最大容量时,可用基于就近度和频率的算法进行基于容量的驱逐
- 将根据缓存中的元素上一次访问或者被修改的时间进行基于过期时间的驱逐
- 当向缓存中一个已经过时的元素进行访问的时候将会进行异步刷新
- key将自动被弱引用所封装
- value将自动被弱引用或者软引用所封装
- 驱逐(或移除)缓存中的元素时将会进行通知
- 写入传播到一个外部数据源当中
- 持续计算缓存的访问统计指标
为了提高集成度,扩展模块提供了JSR-107 JCache和Guava适配器。JSR-107规范了基于Java 6的API,在牺牲了功能和性能的代价下使代码更加规范。Guava的Cache是Caffeine的原型库并且Caffeine提供了适配器以供简单的迁移策略。
1. 介绍
Caffeine是由Ben Manes创建的一款开源缓存库,它具有以下特性:
-
高性能: Caffeine采用了多种性能优化策略,包括高效的数据结构和无锁算法,以实现卓越的性能表现。
-
内存友好: Caffeine使用近似最近最少使用(LRU)算法,以确保缓存中的数据是最常用的数据,从而最大程度地减少内存占用。
-
异步加载: Caffeine支持异步加载数据,可以有效地处理缓存未命中的情况,提高系统的响应速度。
2. 使用
2.1 导入依赖
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.1.6</version> <!-- 使用最新版本 -->
</dependency>
或者直接观察当前 SpringBoot 自带版本:

2.2 基本用法
import com.github.benmanes.caffeine.cache.Caffeine;
public class CaffeineExample {
public static void main(String[] args) {
// 创建一个缓存实例
Caffeine<String, String> caffeineCache = Caffeine.newBuilder().build();
// 向缓存中放入数据
caffeineCache.put("公众号", "JavaEdge");
// 从缓存中获取数据
String value = caffeineCache.getIfPresent("公众号");
System.out.println("Value for 公众号: " + value);
}
}
3 高级用法
3.1 自定义缓存策略
通过expireAfterWrite、expireAfterAccess等方法自定义缓存项的过期策略。
Caffeine<String, String> caffeineCache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
3.2 异步加载
Caffeine<String, CompletableFuture<String>> caffeineCache = Caffeine.newBuilder()
.buildAsync(key -> CompletableFuture.supplyAsync(() -> loadDataFromDatabase(key)));
4 性能调优
根据实际需求 ß配置,例如缓存的最大大小、刷新策略。
Caffeine<String, String> caffeineCache = Caffeine.newBuilder()
.maximumSize(1000)
.recordStats() // 启用统计信息
.build();
5 总结
通过本文深入了解了Caffeine缓存库的基本用法、高级用法和性能调优选项。Caffeine是一个功能强大且易于使用的缓存库,适用于各种Java应用程序,特别是对性能要求较高的系统。
参考:
- 官方文档
- https:///ben-manes/caffeine/wiki/Roadmap-zh-CN
- https:///ben-manes/caffeine
















