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

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

  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。这表明数据已不再可用。

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

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

相关文章

Docker安装部署ElasticSearch(ES)

文章目录 安装前准备创建挂载目录授权相关权限创建elasticsearch.yml文件 拉取镜像运行容器查看运行情况测试 安装前准备 创建挂载目录 用于在宿主机挂载日志&#xff0c;数据等内容 创建/opt/es/data目录 创建/opt/es/logs目录 创建/opt/es/plugins目录 创建/opt/es/conf目录…

MYSQL调优之思路----sql语句和索引调优

MySQL数据库性能优化包括综合多方面因素&#xff0c;应根据实际的业务情况制定科学、合理的调优方案进行测试调优 文章目录 MySQL性能优化1 优化介绍1.2 优化要考虑的问题2.1 优化可能带来的问题2.2 优化的需求2.3 优化由谁参与2.4 优化的方向2.5 优化的维度 1.2数据库使用优化…

node基础之七:Mongodb 数据库

下载地址&#xff1a;https://www.mongodb.com/try/download/community v&#xff1a;5.0.20 platform&#xff1a;window package&#xff1a;zip 复制到 c 盘/Programs Files c 盘创建 data/db 文件夹 默认存放数据地址 在 bin 目录下启动数据库 mongod, 客户端连接数据库…

【力扣周赛】第 361 场周赛(⭐前缀和+哈希表 树上倍增、LCA⭐)

文章目录 竞赛链接Q1&#xff1a;7020. 统计对称整数的数目竞赛时代码——枚举预处理 Q2&#xff1a;8040. 生成特殊数字的最少操作&#xff08;倒序遍历、贪心&#xff09;竞赛时代码——检查0、00、25、50、75 Q3&#xff1a;2845. 统计趣味子数组的数目竞赛时代码——前缀和…

Rust的derive思考

这几天在Yew的学习实践中&#xff0c;发现derive中的参数中包含了yew自己的东西&#xff0c;比如yew::Properties。习惯使用#[derive(Clone, Debug, PartialEq)]之后&#xff0c;发现还有新的成员&#xff0c;这让我好奇起来。 首先让我们来回顾一下derive是什么。 #[derive(…

【黄啊码】nginx如何设置php运行的

禁止访问 PHP 脚本可以通过 Nginx 服务器配置中的多种方式来实现。以下是其中的一些常见方法&#xff0c;您可以根据实际需求选择合适的方式&#xff1a; 1 禁用 PHP 解析&#xff1a; 在 Nginx 配置中&#xff0c;确保 PHP 脚本无法被解析&#xff0c;从而禁止 PHP 执行。 lo…

【业务功能篇96】微服务-springcloud-springboot-认证服务-登录注册功能-Auth2.0-分布式session

5.登录功能 通过最基础的登录操作来完成登录处理 登录页面处理 认证服务的处理 /*** 注册的方法* return*/PostMapping("/login")public String login(LoginVo loginVo , RedirectAttributes redirectAttributes){R r memberFeginService.login(loginVo);if(r.getC…

thinkphp6 入门(5)-- 模型是什么 怎么用

一、模型 MVC架构 之前开发一个功能&#xff0c;后端为在控制器&#xff08;C&#xff09;中写 php SQL&#xff0c;前端为在页面&#xff08;V&#xff09;中写html css js&#xff0c;这就形成了 VC 架构。 但是发现&#xff0c;相同的数据逻辑&#xff08;SQL&#xf…

Centos、OpenEuler系统安装mysql

要在CentOS上安装MySQL并设置开机自启和root密码&#xff0c;请按照以下步骤进行操作&#xff1a; 确保您的CentOS系统已连接到Internet&#xff0c;并且具有管理员权限&#xff08;root或sudo访问权限&#xff09;。打开终端或SSH会话&#xff0c;使用以下命令安装MySQL&…

IntelliJ IDEA的远程开发(Remote Development)

DEA的远程开发功能&#xff0c;可以将本地的编译、构建、调试、运行等工作都放在远程服务器上执行&#xff0c;而本地仅运行客户端软件进行常规的开发操作即可&#xff0c;官方给出的逻辑图如下&#xff0c;可见通过本地的IDE和服务器上的IDE backend将本地电脑和服务器打通&am…

达梦8 在CentOS 系统下静默安装

确认系统参数 [rootlocalhost ~]# ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited【1048576(即 1GB)以上或 unlimited】 scheduling priority (-e) 0 file size (blocks, -f) unlimite…

三、视频设备的枚举以及插拔检测

一、前言 本章主要讲述&#xff0c;如何获取设备名称以及guid&#xff0c;采集设备的采集格式识别&#xff0c;设备的插拔 设备列表以及属性的获取使用的directshow(后续的MediaFoundation无法获取OBS摄像头) 设备的插拔使用的是QT 捕获系统消息&#xff0c;捕获到设备插拔后&a…

day6_网络编程

网络聊天室 客户端 main.c #include "include/errorAndHead.h"void hander(int sig) {while (waitpid(-1, NULL, WNOHANG) > 0); }int main(int argc, const char *argv[]) {/* 捕获 SIGCHLD 信号 hander 处理*/if (signal(SIGCHLD, hander) SIG_ERR){ERR_MSG…

webpack5 (三)

webpack 高级配置 其实就是对 webpack 进行优化&#xff0c;让代码在编译/运行时性能更好 1. 提升开发体验 2. 提升打包构建速度 3. 减少代码体积 4. 优化代码运行性能 一、提升开发体验 sourcemap 在编译打包后所有的 css 和 js 都合并为了一个文件&#xff0c;并多了很多…

APS系统设计经验分享(时间推导II - 2023.09)

在前一篇关于APS系统设计分享文章(《APS系统设计经验分享(时间推导 - 2023.03)》)中&#xff0c;我们提到将会分享使用OptaPlanner作为规划引擎开发APS系统过程中&#xff0c;遇到的一些时间相关的设计建议与异常情况分析。后来一直忙于项目工作&#xff0c;直到现在才想起仍欠…

CC-TAIX01 HONEYWELL 霍尼韦尔连接工厂热智商远程监测系统

CC-TAIX01 HONEYWELL 霍尼韦尔连接工厂热智商远程监测系统 -霍尼韦尔宣布霍尼韦尔连接工厂热智商,一种基于云的远程监测系统,旨在监测和管理关键的热过程数据。这是霍尼韦尔资产绩效管理(APM)投资组合的一部分。 热智商是工业和商业热应用的远程监测解决方案。它将燃烧设备连…

Flink基础实操-计算单词出现次数

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

【云原生】容器编排工具Kubernetes

目录 一、 K8S介绍 官网地址&#xff1a; 1.1docker编排与k8s编排相比 1.2特性 1.3功能 二、K8S重要组件 2.1核心组件 &#xff08;1&#xff09;Kube-apiserver &#xff08;2&#xff09;Kube-controller-manager &#xff08;3&#xff09;Kube-scheduler &#x…

DevOps管理软件生命周期

整体的软件开发流程 PLAN&#xff1a;开发团队根据客户的目标制定开发计划 CODE&#xff1a;根据PLAN开始编码过程&#xff0c;需要将不同版本的代码存储在一个库中。GIT,SVN BUILD&#xff1a;编码完成后&#xff0c;需要将代码构建并且运行。MAVEN TEST&#xff1a;成功构建…

【性能优化】聊聊性能优化那些事

针对于互联网应用来说&#xff0c;性能优化其实就是一直需要做的事情&#xff0c;因为系统响应慢&#xff0c;是非常影响用户的体验&#xff0c;可能回造成用户流失。所以对于性能非常重要。最近正好接到一个性能优化的需求&#xff0c;需要对所负责的系统进行性能提升。目前接…