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

缓存的放置时间和删除时间

缓存的放置时间和删除时间是指缓存中存储的数据的生命周期。这两个时间点非常重要,因为它们决定了缓存数据的有效期和何时应该从缓存中删除。

  1. 缓存的放置时间(Cache Put Time):这是指数据首次放入缓存的时间点。当数据被放入缓存时,通常会记录下它的放置时间。这个时间点通常用于计算缓存数据的有效期,以便在数据过期后进行更新或重新获取。

  2. 缓存的删除时间(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语言中的缓存管理时,通常会使用各种库和框架,最常见的包括:

  1. Java Caching API (javax.cache):Java Caching API 是 Java SE 8 的一部分,提供了一种标准的缓存管理方式。它定义了一套缓存管理接口和注解,允许开发人员在应用程序中使用不同的缓存提供程序,如Ehcache、Caffeine等。使用Java Caching API,你可以轻松地创建、配置和管理缓存,以及设置缓存的过期时间。

  2. Ehcache:Ehcache 是一个广泛使用的开源缓存库,它提供了灵活的缓存管理功能,包括缓存的放置、过期策略、磁盘持久化等。你可以使用 Ehcache 来创建本地内存缓存或分布式缓存。

  3. Caffeine:Caffeine 是一个高性能的本地内存缓存库,特别适用于需要快速访问和低延迟的应用程序。它提供了各种缓存策略,包括定时过期、基于大小的过期等。

  4. 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创建一个本地内存缓存,并设置缓存项的过期时间。让我们来分析示例中的操作和结果:

  1. 创建缓存实例:通过使用CacheBuilder类,我们创建了一个Guava Cache实例,设置了最大缓存大小为100个项,并且定义了缓存项的过期时间为10分钟。这意味着缓存中的项在10分钟后会过期。

  2. 放置数据:我们使用put方法将一个键值对("key1", "value1")放置到缓存中。

  3. 获取数据:我们使用getIfPresent方法从缓存中获取键为"key1"的值,并打印出来。在这个示例中,由于数据被刚刚放置到缓存中,所以我们可以成功获取到值,输出为"Value for key1: value1"。

  4. 等待过期:接下来,我们通过让程序休眠1分钟,模拟了过去一段时间。在这1分钟内,缓存中的数据将保持不变。

  5. 过期数据:在休眠结束后,我们再次尝试获取键为"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

解释一下这些输出结果:

  1. 首先,我们将"key1"和"key2"存储在缓存中,并设置了它们的过期时间。然后,我们通过 cache.get("key1")cache.get("key2") 获取它们的值,因为它们都在有效期内,所以返回了相应的值。

  2. 然后,我们休眠了约35秒,让部分数据过期。这会导致"key1"和"key2"的缓存项过期。

  3. 最后,我们再次尝试获取"key1"和"key2"的值,由于它们的缓存项已过期,所以返回了null。这表明数据已不再可用。

相关文章:

缓存的放置时间和删除时间

缓存的放置时间和删除时间是指缓存中存储的数据的生命周期。这两个时间点非常重要&#xff0c;因为它们决定了缓存数据的有效期和何时应该从缓存中删除。 缓存的放置时间&#xff08;Cache Put Time&#xff09;&#xff1a;这是指数据首次放入缓存的时间点。当数据被放入缓存时…...

内网穿透实战应用-如何通过内网穿透实现远程发送个人本地搭建的hMailServer的邮件服务

文章目录 1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工…...

ensp基础命令大全(华为设备命令)

路漫漫其修远兮&#xff0c;吾将上下而求索 今天写一些曾经学习过的网络笔记&#xff0c;希望对您的学习有所帮助。 OSPF,BGP,IS-IS的命令笔记没有写上来&#xff0c;计划单独写&#xff0c;敬请期待&#xff0c;或者您可以在这个网站查查 &#xff1a; 万能查询网站 …...

thinkphp6 入门(4)--数据库操作 增删改查

一、设计数据库表 比如我新建了一个数据库表&#xff0c;名为test 二、配置数据库连接信息 本地测试 直接在.env中修改&#xff0c;不用去config/database.php中修改 正式环境 三、增删改查 引入Db库 use think\facade\Db; 假设新增的控制器路径为 app\test\control…...

MyBatisPlus 基础实现(一)

说明 创建一个最基本的MyBatisPlus项目&#xff0c;参考官网。 依赖 MyBatisPlus 依赖&#xff0c;最新版是&#xff1a;3.5.3.2 &#xff08;截止2023-9-4&#xff09;。 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-bo…...

jmeter 计数器Counter

计数器可以用于生成动态的数值或字符串&#xff0c;以模拟不同的用户或数据。 计数器通常与用户线程组结合使用&#xff0c;以生成不同的变量值并在测试中应用。以下是计数器的几个常用属性&#xff1a; 变量前缀&#xff08;Variable Name Prefix&#xff09;&#xff1a;定义…...

OpenCV(十九):模板匹配

1.模板匹配&#xff1a; OpenCV提供了一个模板匹配函数&#xff0c;用于在图像中寻找给定模板的匹配位置。 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 可以添加 实例…...

支持向量机(一)

文章目录 前言分析数据集线性可分情况下的支持向量机原始问题凸优化包解法对偶问题凸优化包解法 数据集线性不可分情况下的线性支持向量机与软间隔最大化 前言 在支持向量机中&#xff0c;理论逻辑很简单&#xff1a;最大化最小的几何间隔。但是实际编写代码过程中有一个小点需…...

MyBatis中至关重要的关系映射----全方面介绍

目录 一 对于映射的概念 1.1 三种关系映射 1.2 resultType与resultMap的区别 resultType&#xff1a; resultMap&#xff1a; 二&#xff0c;一对一关联查询 2.1 嵌套结果集编写 2.2 案例演示 三&#xff0c;一对多关联查询 3.1 嵌套结果集编写 3.3 案例演示 四&…...

47、TCP的流量控制

从这一节开始&#xff0c;我们学习通信双方应用进程建立TCP连接之后&#xff0c;数据传输过程中&#xff0c;TCP有哪些机制保证传输可靠性的。本节先学习第一种机制&#xff1a;流量控制。 窗口与流量控制 首先&#xff0c;我们要知道的是&#xff1a;什么是流量控制&#xff…...

密码学入门——环游密码世界

文章目录 参考书目一、基本概念1.1 本书主要角色1.2 加密与解密 二、对称密码与公钥密码2.1 密钥2.2 对称密码和公钥密码2.3 混合密码技术 三、其他密码技术 参考书目 图解密码技术 第三版 一、基本概念 1.1 本书主要角色 1.2 加密与解密 加密 解密 密码破译 二、对称密…...

笔记本家庭版本win11上win+r,运行cmd默认没有管理员权限,如何调整为有管理员权限的

华为matebookeGo 笔记本之前有段时间不知怎么回事&#xff0c;打开运行框&#xff0c;没有了那一行“使用管理权限创建此任务”&#xff0c;而且cmd也不再是默认的管理员下的&#xff0c;这很不方便,虽然每次winr &#xff0c;输入cmd后可以按ctrlshitenter以管理员权限运行&am…...

MavenCentral库发布记录

最近发布了 Android 路由库 URouter&#xff0c;支持 AGP8、ActivityResult启动等特性。 把提交到 Maven Central 过程记录一下。 一、注册 Sonatype 账号&#xff0c;新建项目 注册 https://​​issues.sonatype.org 登录后&#xff0c;新建项目&#xff1a; 相关选项&…...

小程序进阶-env(safe-area-inset-bottom)的使用

一、简介 env(safe-area-inset-bottom)和env(safe-area-inset-top)是CSS中的变量&#xff0c;用于获取设备底部和顶部安全区域的大小。 所谓的安全区域就是指在iPhone X及以上的设备中&#xff0c;为避免被屏幕的“刘海”和“Home Indicator”所遮挡或者覆盖的有效区域区域&am…...

移动端App持续集成体系构建实战

这里写目录标题 一、目标1、前言2、优势&#xff1a;3、涉及技术点4、目标 二、测试app构建、打包过程1、安卓打包的环境要求 三、演示安卓源码打包四、演示安卓App部署1、前提条件2、命令控制apk安装与卸载 五、安卓UI自动化测试1、Appium app自动化测试-Python2、实现的验证点…...

Mybatis的关联关系配置一对一,一对多,多对多的映射关系

目录 关联关系映射 一对一关联&#xff1a; 一对多关联&#xff1a; 多对多关联&#xff1a; 导入数据库表 一对多 一对一 多对多 关联关系映射 关联关系映射在Mybatis中主要通过三种方式实现&#xff1a;一对一关联和一对多关联及多对多关联。 一对一关联&#xff1a;…...

计算机竞赛 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层&#xff1a;2.4 池化层&#xff1a;2.5 全连接softmax层&#xff1a;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卷积双向门控循环单元时间序列预测&#xff1b; 2.运行环境…...

[Rust GUI]0.10.0版本iced代码示例 - progress_bar

-1 字体支持 iced0.10.0 仅支持指定系统内置字体(iced默认字体中文会乱码) iced0.10.0 手动加载字体的功能已经砍了&#xff0c;想手动加载就用0.9.0版本&#xff0c;文档0.9.0版本 想显示中文则需要运行在一个自带字体的Windows系统上。而且这个字体最好不要钱。 (Windows闲着…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...