当前位置: 首页 > news >正文

Caffeine的两种实现方式

咱们来具体对比一下你之前给的这段配置代码👇:

 

java

@Configuration @EnableCaching 
public class CacheConfig { @Bean public CacheManager cacheManager() { 
CaffeineCacheManager manager = new CaffeineCacheManager("myCache"); manager.setCaffeine(Caffeine.newBuilder() .maximumSize(100)); 
return manager; 
} 
}
package com.example.caffeinedemo.service;import com.github.benmanes.caffeine.cache.*;
import org.springframework.stereotype.Service;import java.time.Duration;
import java.util.concurrent.*;@Service
public class FlexibleCacheService {private final AsyncCache<String, Object> caffeine;public FlexibleCacheService() {// 构建支持自定义 TTL 的 Caffeine 缓存this.caffeine = Caffeine.newBuilder().expireAfter(new Expiry<String, Object>() {@Overridepublic long expireAfterCreate(String key, Object value, long currentTime) {// 默认 TTL 60 秒(你也可以默认无限)return TimeUnit.SECONDS.toNanos(60);}@Overridepublic long expireAfterUpdate(String key, Object value, long currentTime, long currentDuration) {return currentDuration;}@Overridepublic long expireAfterRead(String key, Object value, long currentTime, long currentDuration) {return currentDuration;}}).scheduler(Scheduler.systemScheduler()).maximumSize(1000).buildAsync();}// 添加缓存 + 指定 TTL(秒)public void put(String key, Object value, long ttlSeconds) {caffeine.put(key, CompletableFuture.completedFuture(value));caffeine.synchronous().policy().expireAfterWrite().ifPresent(policy -> policy.setExpiresAfter(key, Duration.ofSeconds(ttlSeconds)));}// 获取缓存public Object get(String key) {return caffeine.synchronous().getIfPresent(key);}// 删除缓存public void remove(String key) {caffeine.synchronous().invalidate(key);}
}

和我给你的 FlexibleCacheService 有这些关键区别👇:


🔍 本质区别一:使用方式

方面你这段配置 + @CacheableFlexibleCacheService
使用方式通过注解 @Cacheable("myCache") 自动缓存手动调用 put(key, value, ttl) 控制缓存逻辑
缓存触发点自动(方法执行时由 Spring 拦截)手动(你自己判断有没有缓存,自己写)
代码侵入性低,适合标准场景高,适合灵活控制场景

🔧 本质区别二:缓存时间控制(TTL)

方面你这段配置 + @CacheableFlexibleCacheService
TTL 配置方式在 yml 或 Java 配置中统一设置每次 put() 可以自定义 TTL
是否支持动态 TTL❌ 不能(Spring 不支持注解动态 TTL)✅ 完全支持,每个 key 不同时间都行
TTL 更改时是否重新构建缓存✅ 是,修改配置需重启项目❌ 否,动态设置立即生效

⚙️ 实现机制区别

你配置的是...FlexibleCacheService 是...
用 Spring Boot 自带的 CacheManager 管理缓存名(“myCache”)完全使用原生 Caffeine 缓存对象自己控制
@Cacheable@CachePut@CacheEvict 等注解支持不依赖注解,纯 Java 手动管理

🧠 举个真实例子来直观感受

比如你要缓存不同接口的数据:

场景建议使用方式
获取系统配置,统一缓存 1 小时✅ 用 @Cacheable("config")
获取用户 session,每个用户 TTL 不同✅ 用 FlexibleCacheService
缓存接口返回值,缓存时间灵活可调✅ 用 FlexibleCacheService
缓存基本数据表内容,全局共用 TTL✅ 用你的 @Cacheable 方式

✅ 总结一句话:

你的配置代码 + @CacheableSpring 标准方式,简单方便,但 TTL 不灵活;

FlexibleCacheService手动缓存方式,更灵活、可控,适合复杂缓存策略。

相关文章:

Caffeine的两种实现方式

咱们来具体对比一下你之前给的这段配置代码&#x1f447;&#xff1a; java Configuration EnableCaching public class CacheConfig { Bean public CacheManager cacheManager() { CaffeineCacheManager manager new CaffeineCacheManager("myCache"); manager.…...

单细胞Seurat标准分析流程R语言封装

单细胞Seurat标准分析流程R语言封装 数据预处理与质控(线粒体基因比例计算、QC图表生成)标准化与高变基因筛选PCA/UMAP降维与聚类分析 差异表达分析模块自动化输出PNG可视化图表(质控小提琴图、UMAP聚类图)结果将保存在results/和figures/目录下(RDS对象、差异基因CSV表格…...

MOS管的发热原因和解决办法

发热来源 如上图&#xff0c;MOS管的工作状态有4种情况&#xff0c;分别是开通过程&#xff0c;导通过程&#xff0c;关断过程和截止过程。 导致发热的损耗主要有两种&#xff1a;开关损耗、导通损耗。 导通损耗 导通损耗比较好计算&#xff0c;根据驱动电压VGS值可以得到MOS…...

航顺HK32M070电钻解决方案:驱动未来,掌控无限可能

一、市场规模与增长&#xff1a;电动工具行业持续扩容&#xff0c;电钻需求强劲 全球电动工具市场规模近年来保持稳定增长&#xff0c;2023年市场规模已达288.5亿美元&#xff0c;预计2024年将突破304.9亿美元&#xff0c;年复合增长率达6.9%。中国市场表现尤为亮眼&#xff0…...

关于nacos注册的服务的ip异常导致网关路由失败的问题

文章目录 关于nacos注册的服务的ip异常导致网关路由失败的问题相关处理方案为方案一:手动指定服务注册的 IP 地址方法二&#xff1a;设置优先使用的网络段方法三&#xff1a;指定网络接口方法四&#xff1a;忽略特定的网卡 备注 关于nacos注册的服务的ip异常导致网关路由失败的…...

UI测试流程与关键注意点解析

在当今以用户体验为核心的数字时代&#xff0c;用户界面(UI)作为软件与用户交互的直接窗口&#xff0c;其质量直接影响着产品的成败。UI测试作为软件测试的重要组成部分&#xff0c;确保应用程序不仅功能完善&#xff0c;而且在视觉呈现和交互体验上也能满足用户期望。 作为软…...

从零开始构建智能聊天机器人:Rasa与ChatGPT API实战教程

引言&#xff1a;AI对话系统的时代机遇 在数字化转型浪潮中&#xff0c;聊天机器人已成为连接用户与服务的关键纽带。无论是客服系统中的724小时即时响应&#xff0c;还是智能家居中的语音交互&#xff0c;聊天机器人正在重塑人机交互方式。本文将通过详细教程&#xff0c;手把…...

SSM aop切面编程的学习

面向切面的AOP编程的引入&#xff1a; 1. 代码缺陷 - 非核心代码对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力 - 附加功能代码重复&#xff0c;分散在各个业务功能方法中&#xff01;冗余&#xff0c;且不方便统一维护&#xff01; 2. 解决思路 …...

Zen 5白色装机优选,华硕X870 AYW GAMING WIFI W主板来了!

华硕X870/X870E系列主板再次迎来新成员——华硕X870 AYW GAMING WIFI W主板正式发售&#xff01;专为追求高性价比游戏玩家而量身打造&#xff0c;延续AYW系列经典SPACE太空元素&#xff0c;配合大面积银白色散热装甲&#xff0c;打造出了极具金属质感和科技感的外观&#xff0…...

第Y1周:调用YOLOv5官方权重进行检测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 1、前言2、下载源码3、运行代码 1、前言 YOLOv5分为YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本&#xff0c;这里以YOLOv5s为例。 2、下载源码 安…...

科技项目验收测试怎么做?验收测试报告如何获取?

科技项目从研发到上市需要一个很长的周期&#xff0c;并且在上市之前还有一个至关重要的交付过程&#xff0c;那就是项目验收&#xff0c;验收需要通过验收测试来呈现。科技项目验收测试是确保项目成功交付的关键步骤&#xff0c;那么是如何进行的呢?企事业单位想要获取科技项…...

C++笔记

C知识笔记 一、C概述 C是一种通用编程语言&#xff0c;它在C语言的基础上扩展而来&#xff0c;支持面向对象编程、泛型编程和过程化编程等多种编程范式。C具有高效、灵活、接近硬件等特点&#xff0c;广泛应用于系统软件、应用软件、嵌入式系统、游戏开发等领域。其强大的性能…...

国产Linux统信安装mysql8教程步骤

系统环境 uname -a Linux FlencherHU-PC 6.12.9-amd64-desktop-rolling #23.01.01.18 SMP PREEMPT_DYNAMIC Fri Jan 10 18:29:31 CST 2025 x86_64 GNU/Linux下载离线安装包 浏览器下载https://downloads.mysql.com/archives/get/p/23/file/mysql-test-8.0.33-linux-glibc2.28…...

如何应对“最后时刻任务堆积”(鼓包现象)

应对“最后时刻任务堆积”&#xff08;鼓包现象&#xff09;的方法包括&#xff1a;合理规划项目时间表、强化进度跟踪管理、明确任务优先级、有效的资源配置、提升团队沟通效率。其中&#xff0c;强化进度跟踪管理尤为关键。根据项目管理协会&#xff08;PMI&#xff09;的调查…...

C语言,原码、补码、反码

计算机是以补码来存储的 原码&#xff1a;正数最高位为&#xff1a;0&#xff1b;负数最高位为&#xff1a;1 &#xff08;最高位是符号位&#xff09; 正数&#xff1a;三码合一 如&#xff1a;2&#xff1a; 原码&#xff1a;0000 0000 0000 0000 0000 0000 0000 0010&#…...

Unifying Short and Long-Term Tracking with Graph Hierarchies—CVPR2023

Unifying Short and Long-Term Tracking with Graph Hierarchies 博客目录 Unifying Short and Long-Term Tracking with Graph Hierarchies摘要概况引言和相关介绍提出的观点 SUSHI核心构建跟踪图的层次结构构建分层剪辑分区 做第二个创新模块的需要将研究的重点从处理遮挡的问…...

深入解析 C# 中的模板方法设计模式

模板方法设计模式&#xff08;Template Method Pattern&#xff09;是行为型设计模式中的一种&#xff0c;它定义了一个操作中的算法框架&#xff0c;并允许子类在不改变算法整体结构的情况下&#xff0c;重新定义该算法的某些步骤。该模式通常用于类中包含一系列固定步骤的算法…...

0411 | 软考高项笔记:项目立项

在软考的项目管理知识体系中&#xff0c;技术可行性和经济可行性是项目立项阶段非常重要的两个分析维度。以下是对这两个考点的详细解释和记忆方法&#xff1a; 技术可行性分析 定义&#xff1a; 技术可行性分析是评估项目在现有技术条件和资源下是否能够成功实施。它主要回答…...

ubnetu 服务器版本常用端口和开放的端口对应的应用

1. 使用 netstat 查看端口与进程 netstat 是查看网络连接和监听端口的常用工具。通过以下命令可以列出所有开放的TCP/UDP端口及其关联的进程&#xff1a; sudo netstat -tulnp参数解析&#xff1a; -t&#xff1a;显示TCP端口。 -u&#xff1a;显示UDP端口。 -l&#xff1…...

【服务器端表单字符验证】

文章目录 一、实验目的二、核心代码实现三、调试关键问题四、总结 一、实验目的 掌握JSP表单验证在服务器端的实现技术&#xff0c;实现对用户输入字符的非空及长度为5的验证&#xff0c;返回对应提示信息并优化用户交互。 二、核心代码实现 前端表单 <form action"…...

pip 与 conda 的全面比较:Python 包管理的深度解析

在 Python 的生态系统中&#xff0c;包管理工具是开发者日常工作的重要组成部分。​其中&#xff0c;pip 和 conda 是最常用的两种包管理工具。​虽然它们在功能上有一些重叠&#xff0c;但在设计理念、功能范围、依赖管理、环境隔离等方面存在显著差异。​本文将从多个维度深入…...

GTID不一致修复

背景描述 GTID模式下&#xff0c;mysql主从切换后&#xff0c;主从同步报错 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION 1, but the master has purged bi…...

conda-pack打包环境到超算上。解决无法打包可编辑包

conda-pack 打包 使用 conda-pack 打包 Conda 环境可以将整个环境打包成一个独立的可移植压缩包&#xff0c;方便在其他机器上解压使用。以下是具体步骤&#xff1a; 1.安装 conda-pack 首先需要安装 conda-pack。你可以通过 conda 或 pip 安装&#xff1a; conda install …...

O(n)复杂度实现寻找数组第k小的数(快速选择算法)

非堆排序实现&#xff0c;利用快速排序思想实现的快速选择 package algorithm;public class Test {public int quickSelect(int nums[], int left, int right, int k){if (left right) return nums[left];int i left - 1, j right 1, x nums[left];while (i < j){do i…...

利用 RNN 预测股票价格:从数据处理到可视化实战

在金融领域&#xff0c;预测股票价格走势一直是众多投资者和研究者关注的焦点。今天&#xff0c;我们将利用深度学习中的循环神经网络&#xff08;RNN&#xff09;来构建一个简单的股票价格预测模型&#xff0c;并详细介绍从数据加载、预处理、模型搭建、训练到最终结果可视化的…...

前端从全链路角度分析性能

在面试中回答“从全链路角度分析性能优化”时,需覆盖用户请求到页面渲染的完整链路。以下是结构化回答框架,结合业界实践和最新优化策略: 一、网络传输优化 1. CDN与协议升级 ◦ 使用CDN缩短资源物理距离,结合HTTP/2/3的多路复用和头部压缩特性,提升资源加载效率(如We…...

2025年第十八届“认证杯”数学中国数学建模网络挑战赛【BC题】完整版+代码+结果

# 问题一&#xff1a;随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二&#xff1a;LSTM时间序列预测from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…...

权限管控与数据安全:衡石ChatBot在钉钉中的合规部署指南

数据安全是ChatBot落地的第一道门槛 在数字化转型浪潮下&#xff0c;企业数据查询正从“专业BI工具”向“自然语言交互”跃迁。衡石ChatBot通过钉钉等企业IM工具&#xff0c;让业务人员以对话方式实时获取数据&#xff0c;极大提升了决策效率。然而&#xff0c;数据开放的同时…...

什么是生产管理看板?

简单来说,生产管理看板就是一种把生产过程“摆在明面上”的工具——它可能是贴在墙上的白板,也可能是车间里一块大屏幕,主要作用就是让生产信息一目了然。 这种看板广泛用在工厂、制造车间、或者办公室里,它把生产计划、任务进度、库存情况、设备状态等重要数据通通“晒”…...

YOLO学习笔记 | 一文详解YOLOv11核心创新与实践方法

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== YOLOv11核心创新与实践 一、架构创新1. ‌模块升级与参数优化‌2. ‌多…...

198. 打家劫舍:动态规划

前言 本篇文章来自leedcode&#xff0c;是博主的学习算法的笔记心得。 如果觉得对你有帮助&#xff0c;可以点点关注&#xff0c;点点赞&#xff0c;谢谢你&#xff01; 题目来源 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 题目描述 思路 1.对于只有一个房间…...

算法基础模板

高精度加法 #include <bits/stdc.h> using namespace std; const int N10005; int A[N],B[N],C[N],al,bl,cl; void add(int A[],int B[],int C[]) {for(int icl-1;~i;i--){C[cl]A[i]B[i];C[cl1]C[cl]/10;C[cl]%10;}if(C[cl])cl; } int main() {string a,b;cin>>a&…...

【大模型LLM第十六篇】Agent学习之浅谈Agent loop的几种常见范式

anthropics agent https://zhuanlan.zhihu.com/p/32454721762 code&#xff1a;https://github.com/anthropics/anthropic-quickstarts/blob/main/computer-use-demo/computer_use_demo/loop.py sampling_loop函数 每次进行循环&#xff0c;输出extract tool_use&#xff0…...

[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)

一、前言 &#x1f4cc; 为什么日志在项目中如此重要&#xff1f; 在开发和维护一个后端系统时&#xff0c;日志就像程序运行时的“黑匣子”&#xff0c;帮我们记录系统的各种行为和异常。一份良好的日志&#xff0c;不仅能帮助我们快速定位问题&#xff0c;还能在以下场景中…...

【模拟电路】隧道二极管

与标准二极管相比&#xff0c;隧道二极管通过使用具有令人难以置信的大掺杂水平的半导体物质来工作&#xff0c;导致p-n结之间的耗尽层变得比最快的硅二极管窄约1000倍。 一旦隧道二极管正向偏置&#xff0c;整个p-n结开始发生称为电子流“隧穿”的过程。  在测试隧道二极管的…...

qwen-vl 实现OCR的测试

OCR 技术是数字化时代必不可少的实用工具。以前都依赖专业的公司的专业软件才能完成。成本很高。也正因为如此&#xff0c;我国纸质资料的数字化并不普及。基于大模型的ORC 也许会改变这样的现状。 文本识别&#xff0c;也称为光学字符识别 (OCR)&#xff0c;可以将印刷文本或…...

3.0/Q2,Charls最新文章解读

文章题目&#xff1a;Exploring the association between socioeconomic inequalities in chronic respiratory disease and all-cause mortality in China: findings from the China Health and Retirement Longitudinal Study DOI&#xff1a;10.3389/fpubh.2024.1472074 中文…...

【大模型系列篇】基于Ollama和GraphRAG v2.0.0快速构建知识图谱

GraphRAG是一种结合了知识图谱和大型语言模型的检索增强生成&#xff08;RAG&#xff09;技术。它通过引入图结构化的知识表示和处理方法&#xff0c;显著提升了传统RAG系统的能力&#xff0c;为处理复杂和多样化数据提供了强有力的支持。更多介绍可以跳转《最强检索增强技术Gr…...

Wincc管对象的使用

Wincc管对象的使用 管对象的调用多边形管T形管双T形管管弯头管道大小调整 管对象的调用 打开【图形编辑器】 多边形管 多边形管如下&#xff1a; 一根管子的顶点数是两个&#xff0c;如果修改顶点数&#xff0c;管子就有多少个端点。 修改顶点数为5 此时点击端点然后拖动&#…...

springboot--页面的国际化

今天来实现页面中的国际化 首先&#xff0c;需要创建一个新的spring boot项目&#xff0c;导入前端模板&#xff0c;在我的博客中可以找到&#xff0c;然后将HTML文件放在templates包下&#xff0c;将其他的静态资源放在statics包下&#xff0c;如下图结构 页面的国际化主要在首…...

记 etcd 无法在docker-compose.yml启动后无法映射数据库目录的问题

1、将etcd 单独提取 Dockerfile #镜像 FROM bitnami/etcd:3.5.11 #名称 ENV name"etcd" #重启 ENV restart"always" #运行无权限 ENV ALLOW_NONE_AUTHENTICATION"yes" #端口 EXPOSE 2379 2380 #管理员权限才能创建数据库 USER root # 设置入口点…...

c++关键字new

链接&#xff1a;【C】C中的new关键字用法详解...

数字内容体验的核心价值是什么?

个性化推荐提升满意度 在数字内容体验的构建中&#xff0c;个性化推荐已成为提升用户满意度的核心策略。通过分析用户行为数据、偏好标签及场景特征&#xff0c;系统能够精准匹配内容资源&#xff0c;减少信息过载带来的决策疲劳。例如&#xff0c;基于用户画像的动态推荐算法…...

通过实施最小权限原则(POLP)来保护敏感数据

在处理机密信息时&#xff0c;应始终将确保组织的敏感数据安全放在首位。无论是制定新政策还是参与项目协作&#xff0c;都应采取一切必要预防措施&#xff0c;确保对任何敏感信息进行恰当的访问控制和存储管理。 最小权限原则(POLP)是企业保护客户与员工数据、财务记录、知识…...

VBA即用型代码手册:文档Document

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…...

【力扣hot100题】(089)最长有效括号

这题目真是越做越难了。 但其实只是思路很难想到&#xff0c;一旦会了方法就很好做。 但问题就在方法太难想了…… 思路还是只要遍历一遍数组&#xff0c;维护动态规划数组记录截止至目前位置选取该元素的情况下有效括号的最大值。 光是知道这个还不够&#xff0c;看了答案…...

为什么需要「实体识别」以及 RAG如何和实体识别结合用

&#x1f916; 为什么要做「实体识别」&#xff1f; 实体识别&#xff08;Named Entity Recognition, NER&#xff09; 是自然语言处理&#xff08;NLP&#xff09;中的一种基础技术&#xff0c;它的目标是&#xff1a; 从文本中识别出“有意义”的实体信息&#xff0c;如人名…...

初级社会工作者考试精选题库

通过练习题库中的题目&#xff0c;考生能了解考试的题型、难度分布以及命题规律&#xff0c;明确备考的重点和难点&#xff0c;有针对性地复习知识点&#xff0c;避免盲目备考。 精选练习题 1、社会工作者小王在为社区孤寡老人提供服务时&#xff0c;总是把他们当成自己的父母来…...

Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification

Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification 目录 Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification`AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)`功能概述参数解释`AutoModelForSequen…...

图书管理系统(Python)

运行结果&#xff1a; 源代码&#xff1a; # 定义一个图书类 class Book: def __init__(self, title, author, isbn): self.title title self.author author self.isbn isbn def show_info(self): print(f"{self.title},{self.author},{self.isbn}") # 图书列表…...