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

CaffeineCache自定义缓存时间

文章目录

  • 1、POM文件依赖
  • 2、声明缓存
  • 3、缓存使用
  • 4、测试缓存
  • 5、自定义缓存过期时间
  • 6、测试自定义超时时间

1、POM文件依赖

<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.0</version></dependency>

2、声明缓存

@Slf4j
public class CaffeineCacheUtils {/*** 声明缓存对象*/private static final Cache<String, Object> CACHE = Caffeine.newBuilder()// 当key和value都没有引用时驱逐缓存.weakKeys().weakValues()// 最大容量.maximumSize(10_000)// 固定存活时间24小时.expireAfterWrite(2 * 60 * 60 * 1000L, TimeUnit.MILLISECONDS).build()// 构建Caffeine缓存;}

3、缓存使用

/*** 添加缓存** @param key   key值* @param value value值*/public static void put(String key, Object value) {CACHE.put(key, value);}/*** 获取缓存对象** @param key key值* @return 返回value值*/public static Object get(String key) {return CACHE.getIfPresent(key);}

4、测试缓存

@Testpublic void testCache() {CaffeineCacheUtils.put("key", "value");Object value = CaffeineCacheUtils.get("key");log.info("value={}", value);}

5、自定义缓存过期时间

expireAfterWrite是指定一个固定的过期时间,如果想要根据不同的key值自己指定过期时间,可以按照下面的方法来实现。

声明一个缓存value值holder对象

@Data
public class CacheValueHolder implements Serializable {@Serialprivate static final long serialVersionUID = 1398783661313031605L;private Object value;private TimeUnit timeUnit;private long expire;}

创建缓存容器

/*** 声明缓存对象*/private static final Cache<String, CacheValueHolder> CACHE = Caffeine.newBuilder()// 当key和value都没有引用时驱逐缓存.weakKeys().weakValues()// 最大容量.maximumSize(10_000).expireAfter(new Expiry<String, CacheValueHolder>() {@Overridepublic long expireAfterCreate(String key, CacheValueHolder valueHolder, long currentTime) {log.info("创建缓存对象,key={},value={},currentTime={}", key, JSON.toJSONString(valueHolder), currentTime);return valueHolder.getTimeUnit().toNanos(valueHolder.getExpire());}@Overridepublic long expireAfterUpdate(String key, CacheValueHolder valueHolder, long currentTime, @NonNegative long currentDuration) {log.info("更新缓存对象,key={},value={},currentTime={},currentDuration={}", key, JSON.toJSONString(valueHolder), currentTime, currentDuration);return valueHolder.getTimeUnit().toNanos(valueHolder.getExpire());}@Overridepublic long expireAfterRead(String key, CacheValueHolder valueHolder, long currentTime, @NonNegative long currentDuration) {log.info("读取缓存对象,key={},value={},currentTime={},currentDuration={}", key, JSON.toJSONString(valueHolder), currentTime, currentDuration);return currentDuration;}})// 如果缓存不存在,则同步查询事业部产品列表,同时加入缓存.build()// 构建Caffeine缓存;

修改缓存使用方法

/*** 添加缓存** @param key      key值* @param value    value值* @param expire   过期时间* @param timeUnit 时间类型*/public static void put(String key, Object value, long expire, TimeUnit timeUnit) {CacheValueHolder valueHolder = new CacheValueHolder();valueHolder.setValue(value);valueHolder.setExpire(expire);valueHolder.setTimeUnit(timeUnit);CACHE.put(key, valueHolder);}/*** 添加缓存** @param key   key值* @param value value值*/public static void put(String key, Object value) {// 默认缓存存在时间为1000毫秒put(key, value, 1000, TimeUnit.MILLISECONDS);}/*** 获取缓存对象** @param key key值* @return 返回value值*/public static Object get(String key) {CacheValueHolder valueHolder = CACHE.getIfPresent(key);if (Objects.isNull(valueHolder)) {return null;}return valueHolder.getValue();}

6、测试自定义超时时间

@Testpublic void testCache() throws InterruptedException {CaffeineCacheUtils.put("key1", "value1", 1000L, TimeUnit.MILLISECONDS);CaffeineCacheUtils.put("key2", "value2", 2000L, TimeUnit.MILLISECONDS);Object value1 = CaffeineCacheUtils.get("key1");Object value2 = CaffeineCacheUtils.get("key2");log.info("value1={}", value1);log.info("value2={}", value2);TimeUnit.MILLISECONDS.sleep(1000L);Object value11 = CaffeineCacheUtils.get("key1");Object value22 = CaffeineCacheUtils.get("key2");log.info("value1={}", value11);log.info("value2={}", value22);}

方法运行后日志为:

23:44:21.398 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 创建缓存对象,key=key1,value={"expire":1000,"timeUnit":"MILLISECONDS","value":"value1"},currentTime=8165196876700
23:44:21.401 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 创建缓存对象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8165240503500
23:44:21.401 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 读取缓存对象,key=key1,value={"expire":1000,"timeUnit":"MILLISECONDS","value":"value1"},currentTime=8165240686100,currentDuration=956190600
23:44:21.403 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 读取缓存对象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8165242670700,currentDuration=1997832800
23:44:21.403 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value1=value1
23:44:21.403 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value2=value2
23:44:22.410 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 读取缓存对象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8166249659500,currentDuration=990844000
23:44:22.411 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value1=null
23:44:22.412 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value2=value2

可以看到同时放入缓存容器中的两个缓存,一个1000毫秒的过期时间,一个2000毫秒的过期时间,当刚放入时都可以获取到,等待1000毫秒后,只有第二个缓存可以获取到,第一个缓存对象已经过期获取不到,实现了用户自定义缓存对象过期时间。

相关文章:

CaffeineCache自定义缓存时间

文章目录 1、POM文件依赖2、声明缓存3、缓存使用4、测试缓存5、自定义缓存过期时间6、测试自定义超时时间 1、POM文件依赖 <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1…...

python实战项目58:采集蜻蜓FM热门音频top排行榜

python实战项目58:采集蜻蜓FM热门音频top排行榜 一、采集流程介绍二、数据接口采集三、使用xpath提取页面数据1、抓包,找到数据接口2、发送请求,获取数据3、提取数据4、保存数据一、采集流程介绍 蜻蜓FM热门音频top排行榜的链接为: https://m.qingting.fm/rank/,首页如下图…...

STM32【3】芯片的底层组成概论

关于单片机的组成 单片机的意思是&#xff0c;小小计算电脑&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff0c;里面包含了CPU&#xff0c;ROM&#xff0c;RAM&#xff0c;各种外设。 CPU地位最高&#xff0c;可以访问ROM和RAM&#xff0c;Flash&#xff0c;GPIO等外设&…...

基于django图书信息管理系统的搭建(增删改查)

✍django项目搭建教程 ☞ ----------------- 教程 本文主要讲解django如何连接数据库MySQL并且可视化展示&#xff0c;实现增删改查功能 目录 一. 创建django应用 二. 数据库配置 三. 查看数据库 四. 编写代码 4.1视图函数 4.2 配置URL 4.3创建模板文件 4.…...

Kotlin 知识点二 延迟初始化和密封类

对变量延迟初始化 Kotlin 语言的许多特性&#xff0c;包括变量不可变&#xff0c;变量不可为空&#xff0c;等等。这些特性 都是为了尽可能地保证程序安全而设计的&#xff0c;但是有些时候这些特性也会在编码时给我们带来不 少的麻烦。 比如&#xff0c;如果你的类中存在很多…...

基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“古城景区管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 系统注册界面 景…...

QT C++ QtConcurrent::run 异步任务 简单例子

QtConcurrent命名空间提供了高级API&#xff0c;使得无需使用低级线程原语即可编写多线程程序。 ‌QtConcurrent::run‌是Qt框架中用于简化并发编程的一个功能&#xff0c;主要用于在后台线程中异步执行函数或成员函数。其主要用途包括&#xff1a; ‌异步执行函数‌&#xf…...

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉&#xff0c;这里提出一种简单易懂的解法&#xff08;有点暴力&#xff09; 解题思路&#xff1a; 每个数字对应有自己的字母串&#xff1b; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母&#xff0c;让每个字母与…...

企业业务安全进阶之路:AI技术与数据分析的应用

在数字化时代&#xff0c;企业业务安全面临着前所未有的挑战。从网络安全到数据保护&#xff0c;每一个环节都至关重要。本文将探讨如何通过AI技术和数据分析来提升企业业务安全防护能力&#xff0c;确保企业在不断变化的安全威胁面前保持领先地位。 企业业务安全的重要性 企…...

windows本地升级npm

## 在管理员身份的cmd中&#xff1a; 运行以下命令来安装npm-windows-upgrade工具&#xff1a; npm install --global --production npm-windows-upgrade运行以下命令来升级到最新版本的npm&#xff1a; npm-windows-upgrade --npm-version latest如果你想升级到特定版本的n…...

【Redis】在Java中以及Spring环境下操作Redis

Java环境下&#xff1a; 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…...

Sqlserver安全篇之_隐藏实例功能和禁用SQL Server Browser服务

总结&#xff1a; 1、隐藏实例功能和禁用SQL Server Browser服务的功能一样&#xff0c;对应非默认实例(且这个默认实例是1433端口)的情况下&#xff0c;都是需要在连接字符串中提供端口号才能连接到实例 2、隐藏实例功能后&#xff0c;就算开启了SQL Server Browser服务&#…...

Directx上传堆和默认堆注意事项

前景 之前我用directx写上传堆上传给默认堆Index&#xff0c;但是我发现数据无法被GPU读取 void HelloTriangle::createDefaultBuffer(const void* data, const UINT byteSize, ComPtr<ID3D12Resource>& defaultBuffer) {ThrowIfFiled(m_Device->CreateCommitte…...

Java封装弱密码校验工具类

弱密码校验工具类 通过检查密码是否符合某些安全策略来判断其强度 ● 密码长度 ● 字符类型 ● 常见密码组合 import java.util.Arrays; import java.util.HashSet; import java.util.Set;public class WeakPasswordCheckUtil {// 常见弱密码列表&#xff08;可根据需求扩展&…...

Figure自研模型Helix发布,人形机器人迈向新纪元?

Figure 公司自 2022 年成立以来&#xff0c;便在人形机器人领域崭露头角&#xff0c;成为行业内备受瞩目的新星。公司由连续创业者 Brett Adcock 创立&#xff0c;总部位于美国加利福尼亚州桑尼维尔&#xff0c;汇聚了来自波士顿动力公司、特斯拉、谷歌 DeepMind 等知名企业的顶…...

vue3.0将后端返回的word文件流转换为pdf并导出+html2pdf.js将页面导出为pdf

实现思路 1.将Word文档转换为HTML&#xff1a;mammoth.js&#xff0c;它可以将.docx文件转换为HTML 2.将HTML转换为PDF&#xff1a;使用html2pdf.js将HTML转换为PDF 如果想要相同的效果&#xff0c;也可以把前端页面直接导出转换为pdf: 运用的插件&#xff1a;html2pdf.js 后端…...

(Arrow)试时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…...

SV基础(一):System Verilog与Verilog核心区别详解

文章目录 **1. 设计增强功能****数据类型扩展****接口(Interface)****2. 验证功能增强****断言(Assertions)****约束随机测试****功能覆盖率****3. 面向对象编程(OOP)****4. 测试平台(Testbench)改进****5. 语法简化****6. 其他关键区别****学习建议**System Verilog 是…...

锂电池使用和存储电压

表格补充说明&#xff1a; 每列数据中&#xff0c;2S和3S电池的数值都是单电芯数值的2倍和3倍&#xff1b;对于其他电压的电池&#xff0c;将单电芯数值乘以相应S数即可&#xff1b;理论上单个电芯过放电压为3.0V&#xff0c;实际中为了保险&#xff0c;电压降到3.6V即需充电。…...

【docker】namespace底层机制

Linux 的 Namespace 机制是实现容器化&#xff08;如 Docker、LXC 等&#xff09;的核心技术之一&#xff0c;它通过隔离系统资源&#xff08;如进程、网络、文件系统等&#xff09;为进程提供独立的运行环境。其底层机制涉及内核数据结构、系统调用和进程管理。以下是其核心实…...

欧拉回路与哈密尔顿回路: Fleury算法与Hierholzer 算法(C++)

图论中的回路是指一个路径, 它从某个顶点开始, 经过所有边恰好一次, 并回到起始顶点. 定义 欧拉回路: 从一个顶点出发, 经过每条边恰好一次, 并且最终回到起始顶点. 哈密尔顿回路: 从一个顶点出发, 经过每个顶点恰好一次, 并且最终回到起始顶点. 欧拉路径: 从一个顶点出发, …...

20250221 NLP

1.向量和嵌入 https://zhuanlan.zhihu.com/p/634237861 encoder的输入就是向量&#xff0c;提前嵌入为向量 二.多模态文本嵌入向量过程 1.文本预处理 文本tokenizer之前需要预处理吗&#xff1f; 是的&#xff0c;文本tokenizer之前通常需要对文本进行预处理。预处理步骤可…...

https:原理

目录 1.数据的加密 1.1对称加密 1.2非对称加密 2.数据指纹 2.1数据指纹实际的应用 3.数据加密的方式 3.1只使用对称加密 3.2只使用非对称加密 3.3双方都使用对称加密 3.4非对称加密和对称加密一起使用 4.中间人攻击 5.CA证书 5.1什么是CA证书 CA证书的验证 6.https的原理 1.数据…...

cmake命令记录

1.project(HELLO) project命令用于设置工程的名称&#xff0c;括号里的参数HELLO便是我们要设置的工程名称;设置工程名称并不是强制性的&#xff0c;但是最好加上。 2.add_executable(hello ./main.c) add_executable用于生成一个可执行文件&#xff0c;第一个参数代表生成的可…...

【Python模块】——pymysql

pymysql是python操作mysql的标准库&#xff0c;可以通过pip install快速导入pymysql包操作数据库 使用pymysql操作mysql 简单demo import pymysql connect pymysql.connect(host"localhost",port3306,user"root",password"root",database&quo…...

在Spring Boot中如何使用Freemaker模板引擎

在 Spring Boot 中使用 FreeMarker 模板引擎可以帮助你创建动态的 Web 页面。以下是详细的步骤和示例代码,介绍如何在 Spring Boot 项目里集成和使用 FreeMarker。 1. 添加依赖 如果你使用的是 Maven 项目,需要在 pom.xml 文件中添加 FreeMarker 相关依赖。Spring Boot 提供…...

数据驱动未来!天合光能与永洪科技携手开启数字化新篇章

在信息化时代的今天&#xff0c;企业间的竞争早就超越了传统产品与服务的范畴&#xff0c;新的核心竞争力即——数据处理能力和信息技术的应用。作为数据技术领域的领军者&#xff0c;永洪科技凭借其深厚的技术积累和丰富的行业经验&#xff0c;成功助力天合光能实现数字化升级…...

JavaScript数据结构-模拟链表

在JavaScript中没有链表这种数据结构&#xff0c;但是我们可以用对象(Object)模拟链表&#xff0c;下面让我们先了解链表是什么。 链表&#xff08;Linked List&#xff09;是一种基础的数据结构&#xff0c;由一系列节点&#xff08;Node&#xff09;组成&#xff0c;每一个节…...

使用 Apache Jena 构建 RDF 数据处理与查询服务

一、引言 随着语义网和知识图谱技术的不断发展&#xff0c;RDF&#xff08;Resource Description Framework&#xff09;作为一种用于描述资源的框架&#xff0c;被广泛应用于知识表示和数据集成。Apache Jena 是一个功能强大的 Java 框架&#xff0c;用于处理 RDF 数据和 SPA…...

tableau之网络图和弧线图

一、网络图 概念 网络图&#xff08;Network Graph&#xff09;&#xff0c;也称为网络可视化&#xff0c;是数据可视化的一种形式&#xff0c;用于显示实体&#xff08;节点&#xff09;之间的关系&#xff08;边&#xff09;。这种图表通过节点和边的结构揭示数据中的复杂关…...