Java高性能缓存库Caffeine全解析

Caffeine 是一个高性能、接近最优的 Java 本地缓存库,由 Ben Manes 开发,作为 Google Guava Cache 的继任者而广受欢迎。它在设计上融合了现代缓存算法(如 Window TinyLFU)、低开销并发控制和丰富的功能特性,被广泛应用于 Spring Boot、Hibernate、Kafka 等主流框架中。

下面从核心特性、工作原理、使用方式、最佳实践四个维度为你系统介绍 Caffeine。


一、为什么选择 Caffeine?(vs. Guava / ConcurrentHashMap)

特性CaffeineGuava CacheConcurrentHashMap
淘汰算法✅ Window TinyLFU(命中率更高)LRU 近似❌ 无自动淘汰
性能⚡ 极高(接近理论最优)良好高(但需手动管理过期)
自动过期✅ 支持expireAfterWrite/Access/Variable✅ 支持❌ 不支持
异步加载AsyncLoadingCache
统计监控✅ 内置 hit/miss/eviction 统计
权重控制maximumWeight+weigher
Spring 集成@Cacheable原生支持✅(但已不推荐)

💡结论:Caffeine 是Guava Cache 的现代化替代品,性能更强、功能更全、维护更活跃。


二、核心特性详解

1.智能淘汰策略:Window TinyLFU

  • 结合LFU(频率) + LRU(新鲜度),解决传统 LFU “冷数据长期驻留” 和 LRU “扫描攻击易失效” 的问题。
  • 实测命中率比 LRU 高 20%~50%,尤其适合有“热点数据”的场景(如用户会话、API 响应缓存)。

2.多种过期策略

Caffeine.newBuilder().expireAfterWrite(10,TimeUnit.MINUTES)// 写入后10分钟过期.expireAfterAccess(5,TimeUnit.MINUTES)// 最后访问后5分钟过期.expireAfter(newExpiry<String,Object>(){publiclongexpireAfterCreate(Stringkey,Objectvalue,longcurrentTime){returnTimeUnit.MINUTES.toNanos(10);}// 可实现 per-entry 动态过期时间})

3.容量控制

  • maximumSize(n):最多缓存 n 个条目(基于数量)
  • maximumWeight(n)+weigher:按权重(如对象大小、内存占用)控制总容量
    .maximumWeight(100_000).weigher((Stringkey,Datavalue)->value.sizeInBytes())

4.异步加载(AsyncLoadingCache)

AsyncLoadingCache<String,String>cache=Caffeine.newBuilder().buildAsync(key->fetchDataFromDB(key));// 返回 CompletableFutureCompletableFuture<String>future=cache.get("userId");future.thenAccept(data->System.out.println(data));

5.监听器与统计

Caffeine.newBuilder().removalListener((key,value,cause)->{System.out.println("Removed: "+key+" due to "+cause);}).recordStats()// 启用统计.build();// 查看命中率System.out.println(cache.stats().hitRate());// 如 0.85

三、基本使用方式

1.手动缓存(Manual Cache)

适用于需要显式put/get的场景(如你的文件上传去重):

Cache<String,Object>cache=Caffeine.newBuilder().expireAfterWrite(10,TimeUnit.MINUTES).maximumSize(10_000).build();cache.put("key","value");Objectval=cache.getIfPresent("key");cache.invalidate("key");// 删除

2.自动加载缓存(Loading Cache)

适用于“按需加载 + 自动缓存”的场景(如数据库查询缓存):

LoadingCache<String,User>userCache=Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(10,TimeUnit.MINUTES).build(key->loadUserFromDB(key));// 自动加载函数Useruser=userCache.get("user123");// 若不存在,自动调用 loadUserFromDB

3.异步加载缓存(AsyncLoadingCache)

适用于 I/O 密集型操作(如远程 API 调用):

AsyncLoadingCache<String,Profile>profileCache=Caffeine.newBuilder().buildAsync(this::fetchProfileAsync);// 返回 CompletableFuture<Profile>

四、高级技巧与最佳实践

✅ 1.线程安全无需担心

  • 所有 Caffeine 缓存都是线程安全的,内部使用Striped Lock / Non-blocking design,高并发下性能优异。

✅ 2.避免在 mappingFunction 中做耗时操作阻塞其他请求

  • LoadingCacheload函数是同步且串行化 per-key的:
    • 同一 key 的多个并发请求,只有一个会触发 load,其余等待结果。
    • 但不同 key 之间完全并行。
  • 如果 load 很慢,考虑用AsyncLoadingCache

✅ 3.合理设置 maximumSize

  • 不要盲目设大,否则可能 OOM。
  • 建议:根据QPS × 平均缓存停留时间估算所需容量。

    例:每秒 1000 请求,缓存保留 10 分钟 → 理论最大条目 ≈ 1000 × 600 = 60 万

✅ 4.结合 Spring Cache 使用

@Configuration@EnableCachingpublicclassCacheConfig{@BeanpublicCacheManagercaffeineCacheManager(){CaffeineCacheManagercacheManager=newCaffeineCacheManager();cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(10,TimeUnit.MINUTES).maximumSize(1000));returncacheManager;}}@ServicepublicclassUserService{@Cacheable("users")publicUsergetUser(Stringid){returndb.findById(id);}}

✅ 5.监控与调优

  • 启用.recordStats(),定期打印cache.stats()
    CacheStatsstats=cache.stats();doublehitRate=stats.hitRate();// 命中率longevictionCount=stats.evictionCount();// 淘汰次数
  • 若命中率 < 70%,考虑增大容量或延长过期时间。

五、典型应用场景

场景推荐用法
防重复提交 / 幂等控制Manual Cache +expireAfterWrite+putIfAbsent
数据库查询缓存Loading Cache +expireAfterWrite
远程 API 响应缓存AsyncLoading Cache +expireAfterWrite
会话/Token 存储Manual Cache +expireAfterAccess(空闲过期)
高频配置项缓存Loading Cache + 较长 TTL

六、依赖引入(Maven)

<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.8</version><!-- 检查最新版 --></dependency>

📌 官网:https://github.com/ben-manes/caffeine
📚 文档:https://github.com/ben-manes/caffeine/wiki


总结

Caffeine 是Java 本地缓存的事实标准,它:

  • 性能顶尖(优于 Guava、Ehcache 本地模式)
  • API 简洁(Manual / Loading / Async 三种模式覆盖所有场景)
  • 功能强大(智能淘汰、动态过期、权重控制、统计监控)
  • 生态完善(Spring、Micronaut、Quarkus 原生支持)

对于你的文件上传去重、接口幂等、热点数据缓存等需求,Caffeine 是轻量、高效、可靠的首选方案。

如需具体场景的代码模板(如分布式锁+本地缓存二级去重),可继续提问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1153916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SmartTaskbar终极指南:重新定义你的Windows桌面体验

SmartTaskbar终极指南&#xff1a;重新定义你的Windows桌面体验 【免费下载链接】SmartTaskbar A lightweight utility which can automatically switch the display state of the Windows Taskbar. 项目地址: https://gitcode.com/gh_mirrors/smar/SmartTaskbar SmartT…

碧蓝航线全皮肤解锁终极配置指南

碧蓝航线全皮肤解锁终极配置指南 【免费下载链接】Perseus Azur Lane scripts patcher. 项目地址: https://gitcode.com/gh_mirrors/pers/Perseus 还在为碧蓝航线中昂贵的皮肤而烦恼吗&#xff1f;Perseus开源补丁为你提供完美的解决方案。这个专为碧蓝航线设计的原生库…

AI健身动作评估方案:不用买显卡,2块钱测试模型效果

AI健身动作评估方案&#xff1a;不用买显卡&#xff0c;2块钱测试模型效果 1. 为什么健身教练需要AI动作评估 作为一名私人健身教练&#xff0c;你是否经常遇到这些困扰&#xff1a; 客户动作不规范&#xff0c;但自己无法同时观察多个细节训练报告缺乏可视化数据支撑&#…

AI桌面助手:开启智能办公新纪元的5大效率革命

AI桌面助手&#xff1a;开启智能办公新纪元的5大效率革命 【免费下载链接】chatbox Chatbox是一款开源的AI桌面客户端&#xff0c;它提供简单易用的界面&#xff0c;助用户高效与AI交互。可以有效提升工作效率&#xff0c;同时确保数据安全。源项目地址&#xff1a;https://git…

Mac Mouse Fix性能优化指南:核心技术解析与效率提升实战

Mac Mouse Fix性能优化指南&#xff1a;核心技术解析与效率提升实战 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/gh_mirrors/ma/mac-mouse-fix Mac Mouse Fix通过系统级的鼠标事件拦截和智…

Xournal++跨平台手写笔记软件安装与优化全攻略

Xournal跨平台手写笔记软件安装与优化全攻略 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), macOS and Windows 10. Supports pen inp…

QQ群数据采集工具完整指南:3步获取精准社群画像

QQ群数据采集工具完整指南&#xff1a;3步获取精准社群画像 【免费下载链接】QQ-Groups-Spider QQ Groups Spider&#xff08;QQ 群爬虫&#xff09; 项目地址: https://gitcode.com/gh_mirrors/qq/QQ-Groups-Spider 还在为寻找目标用户群体而苦恼吗&#xff1f;想要快速…

手势识别:MediaPipe

手势识别&#xff1a;MediaPipe 1. 引言&#xff1a;AI 手势识别与人机交互的未来 随着人工智能在计算机视觉领域的持续突破&#xff0c;手势识别正逐步成为下一代人机交互的核心技术之一。从智能穿戴设备到虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&…

腾讯二面:王者荣耀亿级排行榜,如何设计?

前言大家好分享一道网上很火的腾讯面试题:亿级用户排行榜怎么设计呢&#xff1f;换种说法&#xff0c;王者荣耀亿级排行榜&#xff0c;如何设计&#xff1f;本文田螺哥从面试的角度&#xff0c;跟大家一起探讨一下&#xff0c;如何回答更好呢&#xff1f;数据库的order by为什么…

2026开年,团队精益求精耗时2月整理的国内hr saas人力资源管理软件top10排名整理!

2025 年&#xff0c;是国内HR SaaS市场迎来规模化爆发的关键时间节点&#xff0c;据行业权威数据显示&#xff0c;全年市场规模成功冲破260亿元大关&#xff0c;这一数字不仅刷新了历史纪录&#xff0c;更标志着企业人力资源管理正式告别 “基础信息化” 的初级阶段&#xff0c…

ComfyUI-Impact-Pack中SAM模型加载失败的完整解决方案

ComfyUI-Impact-Pack中SAM模型加载失败的完整解决方案 【免费下载链接】ComfyUI-Impact-Pack 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Impact-Pack ComfyUI-Impact-Pack作为ComfyUI生态中功能强大的图像处理扩展包&#xff0c;在面部细节增强、语义分割和…

Xournal++数字手写笔记终极指南:跨平台安装与高效使用全解析

Xournal数字手写笔记终极指南&#xff1a;跨平台安装与高效使用全解析 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), macOS and Wind…

B站视频下载完整方案:从零开始掌握高清视频获取技巧

B站视频下载完整方案&#xff1a;从零开始掌握高清视频获取技巧 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 在数字化内容盛行的今…

Window Resizer终极指南:快速掌握窗口尺寸调整技巧

Window Resizer终极指南&#xff1a;快速掌握窗口尺寸调整技巧 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 在当今多任务工作环境中&#xff0c;窗口尺寸的精确控制成为提升效率…

终极指南:ComfyUI中SAM模型加载问题的完整解决方案

终极指南&#xff1a;ComfyUI中SAM模型加载问题的完整解决方案 【免费下载链接】ComfyUI-Impact-Pack 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Impact-Pack 当你在ComfyUI-Impact-Pack中使用SAM模型时&#xff0c;是否遇到过这样的困扰&#xff1a;精心设…

AI手势识别彩虹骨骼色彩设计原理:视觉区分度优化实战

AI手势识别彩虹骨骼色彩设计原理&#xff1a;视觉区分度优化实战 1. 引言&#xff1a;AI 手势识别与追踪的技术演进 随着人机交互技术的不断演进&#xff0c;AI手势识别正逐步从实验室走向消费级应用。无论是智能穿戴设备、AR/VR交互系统&#xff0c;还是无接触控制场景&…

构建 Agent Native 软件的完整技术指南

当代码终结之后&#xff0c;软件该怎么写&#xff1f; Dan Shipper&#xff08;Every 的联合创始人&#xff09;和 Claude 联手写了一份技术指南&#xff0c;试图给出答案。这是一份构建 Agent 原生软件的完整技术指南。 它系统性地总结了在这个 AI Agent 能够可靠工作的时代&a…

Obsidian Excel插件终极指南:表格管理的完整解决方案

Obsidian Excel插件终极指南&#xff1a;表格管理的完整解决方案 【免费下载链接】obsidian-excel 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-excel 还在为Obsidian中处理复杂数据而困扰吗&#xff1f;原生Markdown表格功能有限&#xff0c;无法满足专业的…

异常处理的终极武器,深度剖析Top SQL异常捕获的7大核心技术

第一章&#xff1a;顶级语句异常捕获 在现代编程实践中&#xff0c;异常处理是保障程序健壮性的核心机制之一。当程序执行过程中发生不可预期的错误时&#xff0c;如文件不存在、网络连接中断或类型转换失败&#xff0c;合理的异常捕获策略能够防止程序崩溃&#xff0c;并提供清…

XAPK转APK智能转换:告别安卓安装困扰

XAPK转APK智能转换&#xff1a;告别安卓安装困扰 【免费下载链接】xapk-to-apk A simple standalone python script that converts .xapk file into a normal universal .apk file 项目地址: https://gitcode.com/gh_mirrors/xa/xapk-to-apk 你是否曾在下载应用后遭遇&q…