Java高性能缓存库:Caffeine

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());
    }
}

适用场景

  • 高频访问数据缓存
  1. 电商系统中的热门商品信息、实时排行榜等,利用Caffeine的高吞吐量,快速响应请求,降低后端数据库压力。
  2. 用户登录状态、购物车信息等实时性要求高的短期数据,通过本地缓存实现微秒级读取延迟。
  • 多级缓存架构本地层
  1. 与Redis等分布式缓存协同,形成“本地缓存+远程缓存”多级结构,优先从Caffeine读取数据,减少网络I/O开销。
  2. 通过本地缓存拦截高频重复请求,避免分布式缓存被击穿,提升系统抗突发流量能力(如秒杀场景)。
  • 低频变更数据存储
  1. 系统参数、枚举值、类目信息等变更频率低的数据,通过Caffeine缓存减少重复计算和数据库查询。
  2. 外部API返回的键值对数据(如地理位置映射、汇率信息),通过本地缓存降低调用频率与响应延迟。
  • 特定性能优化场景
  1. 支持refreshAfterWrite配置,后台异步刷新数据,避免缓存过期时请求阻塞,适用于数据更新周期固定的场景。
  2. 通过弱引用/软引用自动回收机制,在内存不足时优先释放非关键数据,平衡性能与资源消耗。
  • 开发便捷性需求
  1. Spring Boot通过@Cacheable注解无缝集成,5分钟内可完成基础缓存功能搭建,适合中小型项目快速落地。
  2. 支持按时间(创建/访问时间)、容量、权重等多维度设置淘汰策略,适配不同业务特征。


总结

Caffeine因其卓越的性能和灵活的配置选项以及智能淘汰算法,已经成为了现代Java应用程序中实现高效缓存的一个优选方案。无论是构建需要高速读写的本地缓存,还是希望提升应用的整体性能,以及应对高并发、低延迟需求的本地缓存场景,Caffeine都是一个不错的选择。

原文链接:,转发请注明来源!