基于Java 的高性能缓存库 Caffeine 详细介绍

文章目录

引言:Caffeine是一个基于Java的高性能缓存库,旨在为应用程序提供快速、高效且易于使用的本地缓存解决方案。它在很多场景下被用来临时存储经常访问的数据,以减少从数据源(如数据库、远程服务等)重复获取数据的开销,从而提升应用整体性能。

核心特点

  • 高性能和并发能力:Caffeine 采用了先进的算法和数据结构优化,在读写操作上都有着出色的速度表现。
    • 内部使用了类似 ConcurrentHashMap 的结构来支持高并发场景下的高效访问,
    • 运用过期数据清理机制。
  • 灵活的配置:可以根据不同的业务需求对缓存进行多样化配置。
    • 能够设置缓存的初始容量、最大容量、存活时间和刷新间隔。
    • 能够设置缓存项数量上限或者基于内存占用量等方式。
    • 支持定义缓存策略和提醒机制,例如缓存在被访问、插入或删除时触发回调函数。
    • 支持定义缓存项的过期策略,例如基于固定时间过期、基于最后访问时间过期等多种形式。
  • 异步加载支持:支持以异步的方式加载缓存数据,当缓存中不存在所需数据时,可以在后台线程去加载,避免阻塞当前请求线程,提高系统的响应能力和吞吐量。
  • 统计和监控:能够提供详细的缓存使用统计信息,如缓存命中率、插入率和移除率等,方便监控和调优缓存性能。
  • 故障恢复:提供了读写故障恢复机制,当缓存读取失败时,可以自动回退到原始数据源进行读取。

依赖添加

xml 复制代码
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.1.8</version>
</dependency>

示例详解

1、存放缓存

  • 手动加载:需要显式地通过代码向缓存中放入数据,例如使用 put 方法将键值对插入缓存。
java 复制代码
Cache<String, Object> cache = Caffeine.newBuilder().build();
cache.put("key", "value");
Object result = cache.getIfPresent("key");
  • 自动加载(基于LoadingCache接口):可以预先定义好一个加载函数,当缓存中不存在对应的键值对时,Caffeine会自动调用该函数去加载数据并放入缓存。
java 复制代码
LoadingCache<String, Object> loadingCache = Caffeine.newBuilder()
       .build(key -> loadDataFromSomewhere(key));
Object data = loadingCache.get("someKey");

这里的 loadDataFromSomewhere 方法就是项目中自定义的从其他地方(比如数据库查询等)获取数据的函数。

2、过期策略

  • 基于固定时长过期:可以设置缓存项在创建后经过固定的时间段就自动过期,例如设置缓存项存活时间为5分钟,一旦超过这个时间,该缓存项就会被视为无效并从缓存中移除。
java 复制代码
Cache<String, Object> cache = Caffeine.newBuilder()
       .expireAfterWrite(5, TimeUnit.MINUTES)
       .build();
  • 最后访问时间过期:根据缓存项最后一次被访问的时间来判断是否过期,如果在设定的时长内没有被再次访问,就会过期并移除。
java 复制代码
Cache<String, Object> cache = Caffeine.newBuilder()
       .expireAfterAccess(10, TimeUnit.MINUTES)
       .build();

3、缓存驱逐策略

除了因为过期导致的缓存项移除外,当缓存达到设定的最大容量时,Caffeine还需要进行缓存驱逐来腾出空间。它采用了类似LRU(最近最少使用)等高效的算法,优先移除那些近期最少被访问到的缓存项,以保证缓存中总是保留相对更"有用"的数据。例如设置缓存最大容量为100个缓存项。

java 复制代码
Cache<String, Object> cache = Caffeine.newBuilder()
       .maximumSize(100)
       .build();
相关推荐
jinanwuhuaguo39 分钟前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
倒霉蛋小马43 分钟前
【Redis】什么是缓存穿透?
缓存
xmjd msup1 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952362 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.2 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19432 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12212 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px2 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋
rleS IONS2 小时前
SpringBoot中自定义Starter
java·spring boot·后端
苍煜3 小时前
慢SQL优化实战教学
java·数据库·sql