首页/新闻资讯/正文详情

拆解Caffeine源码:BoundedLocalCache如何用环形缓冲与双端队列实现高并发

发布时间:2026/9/21 2:10:45 来源:云帆数科 栏目:资讯中心
拆解Caffeine源码:BoundedLocalCache如何用环形缓冲与双端队列实现高并发
拆解Caffeine源码BoundedLocalCache如何用环形缓冲与双端队列实现高并发【免费下载链接】caffeineA high performance caching library for Java项目地址: https://gitcode.com/gh_mirrors/ca/caffeineCaffeine 是 Java 生态中性能最强的高性能缓存库之一其核心实现位于 BoundedLocalCache.java。这个类靠两大武器实现高并发**环形缓冲Ring Buffer**负责异步吸收海量读操作**双端队列Deque**负责管理缓存条目的淘汰顺序。本文带你通俗地拆解这套设计理解它为什么读起来快、扛得住并发、命中率还高。Caffeine 核心组件全景一张图看懂 BoundedLocalCache先看官方架构图图中自上而下就是 Caffeine 缓存的完整数据流图中信息量很大先记住四个区域区域组件作用左上get/load读请求入口命中数据后顺手记一笔左下Read Buffer / Write Buffer环形缓冲与无锁队列异步记录读与写中间Window / Probation / Protected三个双端队列即 W-TinyLFU 淘汰策略的核心右下countMinSketch频率草图估算每个条目的热度关键思想一句话读请求从不直接改动淘汰策略的数据结构而是先扔进缓冲区由后台维护任务批量处理。这就是高并发的秘密所在。环形缓冲设计让读操作近乎零成本在BoundedLocalCache中每次缓存命中都会执行类似afterRead的动作把节点offer进读缓冲 BoundedLocalCache.java。读缓冲的实际实现是 BoundedBuffer.java它是一个多生产者、单消费者的无锁环形缓冲。它的几个设计决策非常值得新手理解非阻塞 允许失败多个线程竞争同一个写位置时只尝试一次 CAS失败就放弃FAILED绝不重试、不阻塞。缓存策略允许偶尔漏记一次访问这是用最终一致性换取零等待。有损但可接受缓冲满时FULL直接拒绝新元素。访问顺序只是淘汰策略的参考丢一两个不影响正确性。内存可见性精确控制生产者用 release 语义写元素消费者用 acquire 语义读取再配合 release 清空槽位保证多线程下数据不乱序、不丢。防虚假共享false sharing读、写两个计数器之间垫了上百字节的填充字段BBHeader中的 padding让两个高频写变量落在不同的 CPU 缓存行上避免互相踩缓存。分带Striped设计StripedBuffer.java 在检测到竞争时会动态增加缓冲条带进一步摊薄热点。与之对应写缓冲用的是 MpscGrowableArrayQueue.java——一个可增长的无锁多生产者单消费者队列。因为写操作插入、删除不能丢所以写缓冲与有损的读缓冲形成了鲜明对比。双端队列三空间Window、Probation 与 Protected缓冲区里攒下的读事件最终会被维护任务应用到三个按访问顺序排列的双端队列上实现 AccessOrderDeque.java 提供基础双向链表能力Window准入窗口约 1% 容量新条目从这里入门按 LRU 顺序排列。刚被频繁访问的新贵待在这里。Probation试跑区约 19% 容量条目从窗口滑入此处接受考验再次被访问就升级否则就是被淘汰的头号候选。Protected保护区约 80% 容量久经考验的热门条目安居于此按访问顺序排队。淘汰时并不盲选FrequencySketchFrequencySketch.java会先比较新候选者与受害者的历史访问频率频率更高者才能留下——这就是W-TinyLFU策略让 Caffeine 在扫描型负载下依然保持高命中率。更妙的是窗口与主空间的比例不是写死的WindowClimber.java 通过爬山法根据命中率曲线动态调整两者比例让缓存自动适应负载变化。异步维护任务把维护成本摊到每次写入上缓冲区和队列都不是攒着不处理。BoundedLocalCache采用了一套巧妙的调度每次写操作put/remove之后线程顺手检查是否需要执行维护任务如果需要就自愿认领执行而不会专门启动新线程抢占锁。维护周期内依次完成drainReadBuffer → drainWriteBuffer → drainKeyReferences → drainValueReferences → expireEntries → evictEntries → PerformCleanupTask这样访问顺序的更新、过期检查、容量淘汰都在后台批量完成且维护开销被平摊到所有写线程身上。读路径因此极短查 HashMap、更新统计、往环形缓冲里扔个引用三步完事。高并发吞吐表现基准测试数据说话官方 JMH 基准jmh 目录显示得益于环形缓冲、无锁队列和批量维护的设计Caffeine 在读、写、读写混合场景下的吞吐都保持在很高水位对比一下纯读与纯写场景的表现总结三点记住 Caffeine 的高并发之道环形缓冲异步化读事件读不锁化、不阻塞、允许丢失把淘汰策略的更新延迟到后台批量执行BoundedBuffer.java。双端队列分区管理热度Window / Probation / Protected 三个访问顺序队列 频率草图实现 W-TinyLFU 高命中淘汰AccessOrderDeque.java。⚙️维护成本人人分摊写操作后自愿执行维护任务配合无锁写缓冲MpscGrowableArrayQueue.java整体架构以最终一致换极致并发。理解这套环形缓冲 双端队列的组合拳你就不难明白为什么 Caffeine 能在高并发场景下同时兼顾低延迟与高命中率了。【免费下载链接】caffeineA high performance caching library for Java项目地址: https://gitcode.com/gh_mirrors/ca/caffeine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Watch Your Step 图注意力嵌入模型:论文复现、环境搭建与源码级参数解析
Watch Your Step 图注意力嵌入模型:论文复现、环境搭建与源码级参数解析

人工智能深度学习NLP计算机视觉强化学习 【免费下载链接】google-research Google Research 项目地址: https://gitcode.com/gh_mirrors/go/google-research 点击查看 免费下载 导读 本文围绕 Google Research 开源仓库中 graph_embedding/watch_your_step 目录下… · 2026/9/21 2:10:45

OpenClaw实战:AI代理部署与Skills开发全指南
OpenClaw实战:AI代理部署与Skills开发全指南

最近一个月,OpenClaw(社区里也叫Clawdbot)的热度有点猛,技术群、自动化圈子、甚至一些做私域运营的朋友都在讨论它。我抽空把计算巢一键部署、云服务器Docker跑、本地WSL2三套方案都实测了一遍,还把Skills集成和开发流… · 2026/9/21 2:09:45

本地部署AI桌面助手:工业场景下的轻量级落地实践
本地部署AI桌面助手:工业场景下的轻量级落地实践

1. 为什么“本地部署AI桌面助手”突然成了硬需求?去年冬天,我在一家做工业设备远程诊断的客户现场驻场两周。他们产线有三台核心数控机床,每台都连着独立工控机,操作系统是Windows 7嵌入式版,网络策略锁死——只允许访… · 2026/9/21 2:09:45

研发管理系统选型指南:跨部门协同流程梳理与POC验收清单
研发管理系统选型指南:跨部门协同流程梳理与POC验收清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:50:53

脑电采集抗工频干扰:高CMRR前端+自适应陷波方案解析
脑电采集抗工频干扰:高CMRR前端+自适应陷波方案解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:50:53

睡眠耳机怎么选?蓝牙主动降噪与久戴不痛的终极指南
睡眠耳机怎么选?蓝牙主动降噪与久戴不痛的终极指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:50:53

Spring AI 快速入门:5 分钟搭建 Java 大模型对话应用
Spring AI 快速入门:5 分钟搭建 Java 大模型对话应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:50:53

网站开发分为几个方向?这份避坑指南让你少交学费
网站开发分为几个方向?这份避坑指南让你少交学费

网站开发分为几个方向?这份避坑指南让你少交学费 刚接触建站的朋友,是不是对着电脑屏幕发呆?心里最慌的往往不是代码写不出来,而是 备案流程一头雾水 。域名解析了,服务器买好了,结果卡在“ICP备案”这一步,电话打不通,材料被驳回,时间全耗在反复修改上。很多老板以为建站就是找个公司做个页面,其实这里面的… · 2026/9/21 2:49:53

Presto内存管理与溢写磁盘:大查询防OOM的完整解决方案
Presto内存管理与溢写磁盘:大查询防OOM的完整解决方案

Presto内存管理与溢写磁盘:大查询防OOM的完整解决方案 【免费下载链接】presto The official home of the Presto distributed SQL query engine for big data 项目地址: https://gitcode.com/gh_mirrors/pre/presto Presto 是业界主流的分布式 SQL 查询引擎… · 2026/9/21 2:49:53

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化
Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡… · 2026/9/21 0:02:39

Word表格编号全攻略:从列表编号到题注交叉引用
Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技… · 2026/9/21 0:02:39

从第一个站到第二个站:独立开发者的静态网站选型与落地实践
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&… · 2026/9/20 0:00:41

Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行
Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 0:00:18

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码