缓存的放置时间和删除时间
缓存的放置时间和删除时间是指缓存中存储的数据的生命周期。这两个时间点非常重要,因为它们决定了缓存数据的有效期和何时应该从缓存中删除。
-
缓存的放置时间(Cache Put Time):这是指数据首次放入缓存的时间点。当数据被放入缓存时,通常会记录下它的放置时间。这个时间点通常用于计算缓存数据的有效期,以便在数据过期后进行更新或重新获取。
-
缓存的删除时间(Cache Expiry Time):这是指缓存数据的有效期截止时间点。缓存数据在这个时间点之后被认为过期,应该从缓存中删除或刷新。删除时间通常是根据放置时间和缓存策略来计算的,不同的缓存策略(如LRU、TTL等)会影响删除时间的确定。
以下是一些常见的缓存管理策略和相关概念:
-
Time-to-Live(TTL):TTL 是指缓存数据被放置后允许存在的时间长度。一旦TTL时间到期,缓存数据将被认为过期,应该被删除。TTL通常与缓存的放置时间相关,例如,一个缓存项可以有一个TTL为60秒,表示数据将在60秒后过期。
-
LRU(Least Recently Used):LRU是一种基于访问顺序的缓存策略。当缓存空间不足时,系统会删除最近最少使用的缓存项。LRU不关心缓存项的时间戳,只关注访问的频率和顺序。
-
LFU(Least Frequently Used):LFU是一种基于访问频率的缓存策略。它会删除访问频率最低的缓存项,无论访问时间是何时。
-
Cache Eviction(缓存淘汰):这是指根据缓存策略从缓存中删除过期或不再需要的数据项的过程。淘汰过程根据策略和时间来计算缓存项的删除时间。
具体的缓存管理实现和删除时间的计算方式取决于使用的缓存库或框架。一般来说,你可以配置缓存的TTL或使用默认的淘汰策略来管理缓存中数据的生命周期,以确保缓存数据的有效性和性能。
当涉及到Java语言中的缓存管理时,通常会使用各种库和框架,最常见的包括:
-
Java Caching API (javax.cache):Java Caching API 是 Java SE 8 的一部分,提供了一种标准的缓存管理方式。它定义了一套缓存管理接口和注解,允许开发人员在应用程序中使用不同的缓存提供程序,如Ehcache、Caffeine等。使用Java Caching API,你可以轻松地创建、配置和管理缓存,以及设置缓存的过期时间。
-
Ehcache:Ehcache 是一个广泛使用的开源缓存库,它提供了灵活的缓存管理功能,包括缓存的放置、过期策略、磁盘持久化等。你可以使用 Ehcache 来创建本地内存缓存或分布式缓存。
-
Caffeine:Caffeine 是一个高性能的本地内存缓存库,特别适用于需要快速访问和低延迟的应用程序。它提供了各种缓存策略,包括定时过期、基于大小的过期等。
-
Guava Cache:Guava Cache 是 Google Guava 库的一部分,提供了简单而强大的本地内存缓存实现。它支持缓存的最大大小、定时过期、基于引用的缓存、监听器等功能。
下面是一个使用Guava Cache的Java示例,演示了如何创建一个本地内存缓存并设置缓存的过期时间:
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;import java.util.concurrent.TimeUnit;public class CacheExample {public static void main(String[] args) {// 创建一个Guava Cache实例Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100) // 设置缓存最大大小.expireAfterWrite(10, TimeUnit.MINUTES) // 设置缓存项在写入后10分钟过期.build();// 向缓存中放置数据cache.put("key1", "value1");// 从缓存中获取数据String value = cache.getIfPresent("key1");System.out.println("Value for key1: " + value);// 等待一段时间,以使缓存项过期try {Thread.sleep(60000); // 等待1分钟} catch (InterruptedException e) {e.printStackTrace();}// 尝试获取过期的数据value = cache.getIfPresent("key1");System.out.println("Value for key1 after expiration: " + value);}
}
上面的Java示例演示了如何使用Guava Cache创建一个本地内存缓存,并设置缓存项的过期时间。让我们来分析示例中的操作和结果:
-
创建缓存实例:通过使用
CacheBuilder类,我们创建了一个Guava Cache实例,设置了最大缓存大小为100个项,并且定义了缓存项的过期时间为10分钟。这意味着缓存中的项在10分钟后会过期。 -
放置数据:我们使用
put方法将一个键值对("key1", "value1")放置到缓存中。 -
获取数据:我们使用
getIfPresent方法从缓存中获取键为"key1"的值,并打印出来。在这个示例中,由于数据被刚刚放置到缓存中,所以我们可以成功获取到值,输出为"Value for key1: value1"。 -
等待过期:接下来,我们通过让程序休眠1分钟,模拟了过去一段时间。在这1分钟内,缓存中的数据将保持不变。
-
过期数据:在休眠结束后,我们再次尝试获取键为"key1"的值。这一次,由于缓存项的过期时间已经达到,我们无法再获取到它。因此,输出为"Value for key1 after expiration: null",表示数据已经过期并且不再可用。
这个示例演示了如何使用Guava Cache管理本地内存缓存,并设置缓存项的过期时间。这对于需要控制数据存储在内存中的时间以减少内存占用或确保数据的新鲜性非常有用。不同的应用场景可能需要不同的缓存策略,Guava Cache以及其他缓存库提供了丰富的选项来满足这些需求。
在这个示例中,我们使用了Guava Cache创建了一个本地内存缓存,设置了最大大小和缓存项的过期时间。我们放置了一个键值对到缓存中,然后在一段时间后尝试获取它,验证了过期策略的功能。
不同的缓存库和框架提供了各种各样的功能和配置选项,可以根据应用程序的需求选择适合的缓存解决方案。
三级缓存:CreateBeanInstance之后:addSingletonFactory
二级缓存:第一次从三级缓存确定对象是代理对象还是不同对象的时候,同时删除三级缓存getSingleton
一级缓存:生成完整对象之后放到一级缓存,删除二三级缓存:addSingleton
以下是一个使用Java示例代码,演示如何在Java中使用 java.util.HashMap 实现具有放置时间和删除时间的缓存概念。我们将自己管理缓存项的过期时间。
import java.util.HashMap;
import java.util.Map;public class Cache<K, V> {private final Map<K, CacheEntry<V>> cache = new HashMap<>();private final long defaultTtl; // 默认的过期时间(以毫秒为单位)public Cache(long defaultTtl) {this.defaultTtl = defaultTtl;}public void put(K key, V value) {put(key, value, defaultTtl);}public void put(K key, V value, long ttl) {long expirationTime = System.currentTimeMillis() + ttl;cache.put(key, new CacheEntry<>(value, expirationTime));}public V get(K key) {CacheEntry<V> entry = cache.get(key);if (entry != null && entry.isNotExpired()) {return entry.getValue();} else {cache.remove(key);return null;}}private static class CacheEntry<V> {private final V value;private final long expirationTime;CacheEntry(V value, long expirationTime) {this.value = value;this.expirationTime = expirationTime;}boolean isNotExpired() {return System.currentTimeMillis() <= expirationTime;}V getValue() {return value;}}public static void main(String[] args) {Cache<String, String> cache = new Cache<>(60000); // 设置默认过期时间为60秒cache.put("key1", "value1");cache.put("key2", "value2", 30000); // 自定义过期时间为30秒System.out.println("Value for key1: " + cache.get("key1")); // 输出 "value1"System.out.println("Value for key2: " + cache.get("key2")); // 输出 "value2"// 等待一段时间,让部分数据过期try {Thread.sleep(35000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Value for key1: " + cache.get("key1")); // 输出 null,数据已过期System.out.println("Value for key2: " + cache.get("key2")); // 输出 null,数据已过期}
}
在上述示例中,我们创建了一个简单的泛型缓存类 Cache,它允许存储键值对并为每个缓存项设置过期时间。我们使用 java.util.HashMap 存储缓存项,并在获取数据时检查过期时间以确保数据有效性。当数据过期时,我们从缓存中删除它。最后,我们在 main 方法中演示了如何使用这个自定义缓存类。
当你运行上述Java示例代码时,根据缓存项的过期时间和休眠时间,你将获得以下输出结果:
Value for key1: value1
Value for key2: value2
Value for key1: null
Value for key2: null
解释一下这些输出结果:
-
首先,我们将"key1"和"key2"存储在缓存中,并设置了它们的过期时间。然后,我们通过
cache.get("key1")和cache.get("key2")获取它们的值,因为它们都在有效期内,所以返回了相应的值。 -
然后,我们休眠了约35秒,让部分数据过期。这会导致"key1"和"key2"的缓存项过期。
-
最后,我们再次尝试获取"key1"和"key2"的值,由于它们的缓存项已过期,所以返回了
null。这表明数据已不再可用。
相关文章:
缓存的放置时间和删除时间
缓存的放置时间和删除时间是指缓存中存储的数据的生命周期。这两个时间点非常重要,因为它们决定了缓存数据的有效期和何时应该从缓存中删除。 缓存的放置时间(Cache Put Time):这是指数据首次放入缓存的时间点。当数据被放入缓存时…...
内网穿透实战应用-如何通过内网穿透实现远程发送个人本地搭建的hMailServer的邮件服务
文章目录 1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工…...
ensp基础命令大全(华为设备命令)
路漫漫其修远兮,吾将上下而求索 今天写一些曾经学习过的网络笔记,希望对您的学习有所帮助。 OSPF,BGP,IS-IS的命令笔记没有写上来,计划单独写,敬请期待,或者您可以在这个网站查查 : 万能查询网站 …...
thinkphp6 入门(4)--数据库操作 增删改查
一、设计数据库表 比如我新建了一个数据库表,名为test 二、配置数据库连接信息 本地测试 直接在.env中修改,不用去config/database.php中修改 正式环境 三、增删改查 引入Db库 use think\facade\Db; 假设新增的控制器路径为 app\test\control…...
MyBatisPlus 基础实现(一)
说明 创建一个最基本的MyBatisPlus项目,参考官网。 依赖 MyBatisPlus 依赖,最新版是:3.5.3.2 (截止2023-9-4)。 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-bo…...
jmeter 计数器Counter
计数器可以用于生成动态的数值或字符串,以模拟不同的用户或数据。 计数器通常与用户线程组结合使用,以生成不同的变量值并在测试中应用。以下是计数器的几个常用属性: 变量前缀(Variable Name Prefix):定义…...
OpenCV(十九):模板匹配
1.模板匹配: OpenCV提供了一个模板匹配函数,用于在图像中寻找给定模板的匹配位置。 2.图像模板匹配函数matchTemplate void matchTemplate( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask noArray() ); image…...
【iOS】Category、Extension和关联对象
Category分类 Category 是 比继承更为简洁 的方法来对Class进行扩展,无需创建子类就可以为现有的类动态添加方法。 可以给项目内任何已经存在的类 添加 Category甚至可以是系统库/闭源库等只暴露了声明文件的类 添加 Category (看不到.m 文件的类)通过 Category 可以添加 实例…...
支持向量机(一)
文章目录 前言分析数据集线性可分情况下的支持向量机原始问题凸优化包解法对偶问题凸优化包解法 数据集线性不可分情况下的线性支持向量机与软间隔最大化 前言 在支持向量机中,理论逻辑很简单:最大化最小的几何间隔。但是实际编写代码过程中有一个小点需…...
MyBatis中至关重要的关系映射----全方面介绍
目录 一 对于映射的概念 1.1 三种关系映射 1.2 resultType与resultMap的区别 resultType: resultMap: 二,一对一关联查询 2.1 嵌套结果集编写 2.2 案例演示 三,一对多关联查询 3.1 嵌套结果集编写 3.3 案例演示 四&…...
47、TCP的流量控制
从这一节开始,我们学习通信双方应用进程建立TCP连接之后,数据传输过程中,TCP有哪些机制保证传输可靠性的。本节先学习第一种机制:流量控制。 窗口与流量控制 首先,我们要知道的是:什么是流量控制ÿ…...
密码学入门——环游密码世界
文章目录 参考书目一、基本概念1.1 本书主要角色1.2 加密与解密 二、对称密码与公钥密码2.1 密钥2.2 对称密码和公钥密码2.3 混合密码技术 三、其他密码技术 参考书目 图解密码技术 第三版 一、基本概念 1.1 本书主要角色 1.2 加密与解密 加密 解密 密码破译 二、对称密…...
笔记本家庭版本win11上win+r,运行cmd默认没有管理员权限,如何调整为有管理员权限的
华为matebookeGo 笔记本之前有段时间不知怎么回事,打开运行框,没有了那一行“使用管理权限创建此任务”,而且cmd也不再是默认的管理员下的,这很不方便,虽然每次winr ,输入cmd后可以按ctrlshitenter以管理员权限运行&am…...
MavenCentral库发布记录
最近发布了 Android 路由库 URouter,支持 AGP8、ActivityResult启动等特性。 把提交到 Maven Central 过程记录一下。 一、注册 Sonatype 账号,新建项目 注册 https://issues.sonatype.org 登录后,新建项目: 相关选项&…...
小程序进阶-env(safe-area-inset-bottom)的使用
一、简介 env(safe-area-inset-bottom)和env(safe-area-inset-top)是CSS中的变量,用于获取设备底部和顶部安全区域的大小。 所谓的安全区域就是指在iPhone X及以上的设备中,为避免被屏幕的“刘海”和“Home Indicator”所遮挡或者覆盖的有效区域区域&am…...
移动端App持续集成体系构建实战
这里写目录标题 一、目标1、前言2、优势:3、涉及技术点4、目标 二、测试app构建、打包过程1、安卓打包的环境要求 三、演示安卓源码打包四、演示安卓App部署1、前提条件2、命令控制apk安装与卸载 五、安卓UI自动化测试1、Appium app自动化测试-Python2、实现的验证点…...
Mybatis的关联关系配置一对一,一对多,多对多的映射关系
目录 关联关系映射 一对一关联: 一对多关联: 多对多关联: 导入数据库表 一对多 一对一 多对多 关联关系映射 关联关系映射在Mybatis中主要通过三种方式实现:一对一关联和一对多关联及多对多关联。 一对一关联:…...
计算机竞赛 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类
文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层:2.4 池化层:2.5 全连接softmax层:2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…...
时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测
时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测; 2.运行环境…...
[Rust GUI]0.10.0版本iced代码示例 - progress_bar
-1 字体支持 iced0.10.0 仅支持指定系统内置字体(iced默认字体中文会乱码) iced0.10.0 手动加载字体的功能已经砍了,想手动加载就用0.9.0版本,文档0.9.0版本 想显示中文则需要运行在一个自带字体的Windows系统上。而且这个字体最好不要钱。 (Windows闲着…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
