本地缓存Caffeien

news/2025/11/16 17:55:39/文章来源:https://www.cnblogs.com/sunnycc/p/19228613

为什么用本地缓存


低延迟高吞吐:本地缓存直接存储在JVM堆内存中,读写操作无需网络传输,延迟可低至纳秒级,显著优于Redis等分布式缓存的毫秒级响应 。
降低Redis压力:在多级缓存架构中,本地缓存作为第一层缓存,可过滤大部分请求,仅将未命中数据转发至Redis等分布式缓存,降低后端服务和Redis压力。

 

为什么要用Caffeine


吞吐量领先:官方基准测试显示,Caffeine的吞吐量比Guava Cache高40%以上,尤其在高并发场景下表现突出。
并发优化:采用Java 8的StampedLock锁技术,减少锁竞争,提升多线程环境下的并发处理能力。
多种过期策略:支持写后过期(expireAfterWrite)、访问后过期(expireAfterAccess)及自定义过期逻辑,适应不同业务需求
容量控制:提供基于条目数(maximumSize)、权重(maximumWeight)或引用(弱引用/软引用)的灵活容量管理

 

本地缓存的刷新/过期策略

 

refreshAfterWrite(写后刷新):‌在数据被写入缓存后,经过指定的时间间隔,如果数据被再次访问,会触发异步刷新操作‌‌ ,在刷新完成前,所有访问请求会立即返回当前缓存中的旧值
refreshAfterAccess(访问后刷新):‌在数据被访问后,经过指定的时间间隔,如果数据被再次访问,会触发异步刷新操作,在刷新完成前,所有访问请求会立即返回当前缓存中的旧值

expireAfterWrite(基于写入时间过期): 从缓存条目‌创建或最后一次被写入‌时开始计时,超过设定的时间后,该条目会被自动移除‌,数据更新使用加锁方式。
expireAfterAccess(基于访问时间过期): 从缓存条目‌最后一次被访问‌时开始计时,超过设定时间后条目失效‌,‌,数据更新使用加锁方式。

 

数据在expireAfterWrite和expireAfterAccess过期后,新的请求过来caffeine是如何执行的

 

‌检查与移除过期条目‌:当请求访问一个缓存键(Key)时,Caffeine 会首先检查该条目是否已因 expireAfterWrite 而过期。如果已过期,它会立即将这个旧条目从缓存中移除

同步互斥回源加载‌:在移除旧数据后,Caffeine 会为该缓存键获取一个‌同步锁‌。第一个成功获取锁的请求(假设是请求A)将负责执行回源逻辑(例如,通过 CacheLoader 或 Callable 从数据库查询新数据)。

阻塞等待与结果返回‌:在请求A持有锁并加载数据期间,后续任何访问同一键的并发请求(如请求B)会被阻塞,并等待请求A完成操作。

‌数据回填与锁释放‌:请求A成功获取新数据后,会将其存入缓存,然后释放同步锁。此时,所有被阻塞的等待线程(如请求B)会立即被唤醒,并获取到请求A刚加载的新数据。

 

数据在refreshAfterWrit和refreshAfterAccess过期后,新的请求过来caffeine是如何执行的

‌检查刷新条件‌:当请求访问一个缓存键时,Caffeine 会检查该条目自上次写入或刷新后经过的时间是否已经超过了 refreshAfterWrite 设定的阈值需要注意的是,达到刷新时间并不意味着数据已过期(如果同时还配置了更长的 expireAfterWrite,数据可能仍然有效)

‌触发异步刷新‌:如果满足刷新条件,Caffeine 会为这个缓存键触发一个‌异步刷新操作‌,这个操作默认由 ForkJoinPool.commonPool() 执行,也可以通过 Caffeine.executor(Executor) 方法指定自定义的线程池
立即返回旧值‌:在异步刷新操作执行期间,触发刷新的请求以及后续访问同一键的所有请求,都‌不会等待新数据加载完成‌,而是会立即返回当前缓存中持有的旧值,。这是 refreshAfterWrite 与 expireAfterWrite 在行为上的一个关键区别
‌异步加载与更新‌:在后台线程中,Caffeine 会执行 CacheLoader.reload 方法(如果已重写)或默认的 CacheLoader.load 方法来获取新数据,一旦新数据成功加载,它会自动更新到缓存中,替换掉旧值。此后,新的请求将获取到更新后的数据

 

refreshAfterWrite 与 expireAfterWrite 的区别‌:


refreshAfterWrite 关注的是数据的‌新鲜度‌,它异步地更新数据而不阻塞请求,可能会造成短暂时间获取到的是旧址。

expireAfterWrite 关注的是数据的‌有效性‌,当数据过期后,访问请求会同步地回源加载,导致线程阻塞直到新数据返回。

 

过期数据管理

数据惰性删除:惰性删除是指 Caffeine 不会在数据过期时立即将其从缓存中移除,而是等到‌下次访问该数据时‌才会检查其是否过期。如果发现数据已过期,Caffeine 会先将其标记为无效并从缓存中移除,然后再触发回源操作(如从数据库加载新数据)并更新缓存。‌这种机制避免了不必要的同步淘汰操作,减少了主线程的阻塞,从而提升了并发性能
定时清理:为了及时清理那些长期未被访问的过期数据,Caffeine 会启动一个‌后台定时任务‌(默认约每秒执行一次),主动扫描缓存并移除已过期的条目。 这种定期清理机制与惰性删除相结合,既保证了缓存访问的高效性,又避免了内存中堆积大量无效数据。

 


本地缓存数据不一致问题

1.多台机器数据同步:使用MQ进行消息广播通知进行实时变更。
2.先更新库再删除缓存,或者使用延迟双删,延迟双删是解决并发情况下的极端情况,延迟时间需要控制好。

 

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

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

相关文章

实用指南:C++---嵌套类型(Nested Types)封装与泛型的基石

实用指南:C++---嵌套类型(Nested Types)封装与泛型的基石2025-11-16 17:51 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

[ sqlite ]

# 查看所有的表 .tables.schema <tabale name># 打开数据库后先切好显示模式 .headers on .mode column # 查看表结构与列名 .schema ZBILLENTITY PRAGMA table_info(ZBILLENTITY);

视野修炼-技术周刊第127期 | Valdi

① tasuku - 极简 Node 任务处理 ② fkill - 强制终止进程 ③ FileMock ④ Valdi - 新的跨平台 UI 框架 ⑤ JavaScript 引擎大全 ⑥ 使用 Error.cause 进行错误处理 ⑦ GitHub Repo Visibility Analyzer欢迎来到第 127…

完整教程:机器学习:基于大数据的基金数据分析可视化系统 股票数据 金融数据 股价 Django框架 大数据技术(源码) ✅

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

科学计算复习

Scientific Computing Review Outline Author: Hu Si Date: 2025-11-16 Floating-Point Number SystemExample Problem 1.3 Let ( x_f ) and ( y_f ) be adjacent floating-point numbers (positive normal floats). W…

【AIGC】语音识别ASR:火山引擎大模型技术实践 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月石笼网厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读!

在水利防护、交通建设、生态修复等全球重点工程领域,石笼网的品质直接决定工程安全与使用寿命。据国际丝网产业协会(ISIA)2025 年 11 月最新测评数据显示,全球石笼网市场合格率仅为 72%,部分产品因材质劣质、工艺…

2025 年 11 月石笼网厂家最新推荐,技术实力与市场口碑深度解析!

在全球水利工程、边坡防护、生态治理等领域,石笼网的技术工艺与产品品质直接影响工程安全稳定性。据国际建筑防护材料协会(IBPMA)2025 年 11 月发布的测评报告显示,全球石笼网企业中仅 38% 具备核心生产技术专利,…

2025年11月温州律师事务所最新推荐,实力机构深度解析与择选指南!

本次推荐基于国际律师协会(IBA)2025 年度测评标准及第三方数据机构的全年动态监测,覆盖 120 余家法律服务机构的核心维度。测评采用 “定量 + 定性” 双轨体系:定量维度依托 2024-2025 年度公开案例数据库,分析 1…

python: 用pyppeteer以无头方式抓取页面

一,安装第三方库: $ pip install pyppeteer $ pip install beautifulsoup4 二,代码 import asyncio from pyppeteer import launchasync def check():browser = await launch(executablePath=/usr/bin/google-chrom…

python共享内存的读写同步与加锁 —— multiprocessing.Value和multiprocessing.Array、加锁

python共享内存的读写同步与加锁 —— multiprocessing.Value和multiprocessing.Array、加锁multiprocessing.Value多进程读写操作:点击查看代码 import time from multiprocessing import Process, Valuedef func(va…

2025年11月温州律师事务所最新推荐,聚焦资质、案例、服务的五家机构深度解读!

本次推荐基于国际律师协会(IBA)最新测评标准及第三方数据机构的 12 个月动态监测,涵盖 120 余家法律服务机构的资质认证、案例胜诉率、客户满意度等核心维度。测评采用 “定量 + 定性” 双轨体系:定量部分依托 202…

UI设计公司审美积累|办公类软件界面设计巧思,效率与视觉的双重升级

UI设计公司审美积累|办公类软件界面设计巧思,效率与视觉的双重升级作为专注软件界面、大数据可视化的设计公司,今天带大家赏析几组办公类软件界面,看看如何通过设计让 “高效协作” 与 “视觉美感” 并存~🔹 【…

详细介绍:AVL树手撕,超详细图文详解

详细介绍:AVL树手撕,超详细图文详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

网络安全

互联网已逐渐成为我们日常生活不可或缺的部分。谈及互联网必然无法逃离网络安全这个话题,网络安全是什么,网络安全重要性如何,科技的进步对网络安全的推动是积极亦或是负面的...... 网络安全与之相关的概念性词汇有…

Zhengrui 11.16 总结

zhengrui 估计是选的之前的老题。 期望得分:200 pts 实际得分:0 pts 怎么回事呢? T1 noip t1 放博弈是吧。 仔细思考你会发现如果最后是小 A 操作那么小 A 必胜,因为不论最后两个数的奇偶性是什么,总能操作得到偶…

实用指南:spark组件-spark core(批处理)

实用指南:spark组件-spark core(批处理)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

windows安装mingw

mingw-w64的安装 MinGW全称是Minimalist GNU on Windows,也就是将Linux/Unix环境下赫赫有名的GCC编译器以及其相关的编译调试组件移植到了Windows上。 网页地址 https://www.mingw-w64.org/ github地址 https://githu…

C# 高级类型 dynamic,list,泛型(学习笔记5)

1. dynamic .Net Framework4.0新特性,提供了一种弱类型语言特性。 定义的时候不需要指定类型,只在运行时检查,和var不一样。/// <summary>/// dynamic类型/// </summary>public void TestDynamic(){dyn…

filebeat + logstash接入OpenStack日志

背景 本文原发布于CSDN,现搬运至此,免得某天突然变成VIP文章,自己都看不了。 文中有2台主机: (1)1.1.1.1是OpenStack的nova节点,安装filebeat (2)1.1.1.2是logstash节点 在1.1.1.1上通过filebeat读取OpenStac…