Java中TimedCache缓存对象的详细使用

一、TimedCache 是什么?

TimedCache是一个泛型类,它的主要作用通常是在一定时间范围内对特定键值对进行缓存,并且能够根据设定的时间策略来自动清理过期的缓存项。

TimedCache是一种带有时间控制功能的缓存数据结构。在 Java 中,缓存是一种用于临时存储数据的机制,目的是为了减少重复计算或者重复的数据获取操作,提高程序的性能。而TimedCache在此基础上增加了时间维度的管理。

二、常见功能及使用场景

缓存存储:可以将以String为键、BigDecimal为值的键值对存入缓存中,方便后续快速获取,避免重复计算或查询相同的数据。其它类型也可以。(理解为Map集合,键值对)

时间控制:设置缓存项的有效期,一旦超过指定时间,缓存项会被自动视为过期并可能被清理掉。这有助于保证缓存数据的时效性,例如在处理实时金融数据(如汇率、股票价格等,这里值用BigDecimal表示很合适)时,旧的数据在一定时间后就不再有价值,通过定时清理过期缓存可确保获取到相对新的数据。

缓存获取:通过给定的String键,可以快速从缓存中获取对应的BigDecimal值,如果缓存命中则直接返回缓存中的值,提高数据访问效率。

三、使用场景

金融数据处理:如前面提到的汇率、股票价格等数据的缓存。金融数据经常需要实时更新,但在短时间内可能会被多次查询,使用TimedCache<String, BigDecimal>可以缓存这些数据,在有效期内直接从缓存获取,减少对数据源(如金融数据接口)的频繁访问,提高系统响应速度。

电商价格缓存:在电商系统中,商品价格可能会根据促销活动等因素实时变动,但在一定时间段内(比如促销活动期间),对于同一商品的价格查询较为频繁。将商品 ID(可以用String表示)作为键,商品价格(用BigDecimal表示)作为值存入TimedCache,可以在活动期间有效缓存价格数据,提高查询效率。

统计数据缓存:例如网站的实时流量统计数据,以某个统计指标的名称(String)为键,对应的统计数值(可能是BigDecimal类型,如流量的具体数值等)为值进行缓存。这样在短时间内可以快速获取统计数据,并且通过设置合适的时间限制,确保数据能及时更新。

四、使用

1、相关依赖

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.6</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1.1-jre</version></dependency>

2、使用

2.1、自定义工具简单使用:

private static final TimedCache<String, String> TIMED_CACHE = CacheUtil.newTimedCache(5000);static {/** 每5ms检查一次过期 */TIMED_CACHE.schedulePrune(5);}/*** 存入键值对,提供消逝时间** @param key* @param value* @param timeout*/public static void put(String key, String value, Long timeout) {/** 设置消逝时间 */TIMED_CACHE.put(key, value, timeout);}/*** 每次重新get一次缓存,均会重新刷新消逝时间* @param key* @return*/public static String get(String key) {return TIMED_CACHE.get(key);}public static void main(String[] args) {put("haha", "1", 3000L);ThreadUtil.sleep(2000);//    if (TIMED_CACHE.containsKey("haha")) {//      System.out.println("aa");//    }System.out.println("第1次结果:" + get("haha"));ThreadUtil.sleep(2000);System.out.println("第2次结果:" + get("haha"));ThreadUtil.sleep(5000);System.out.println("第3次结果:" + get("haha"));// 取消定时清理TIMED_CACHE.cancelPruneSchedule();}

2.2、糊涂工具使用

CacheUtil具体方法:

/*** 缓存工具类* @author Looly*@since 3.0.1*/
public class CacheUtil {/*** 创建FIFO(first in first out) 先进先出缓存.** @param <K> Key类型* @param <V> Value类型* @param capacity 容量* @param timeout 过期时长,单位:毫秒* @return {@link FIFOCache}*/public static <K, V> FIFOCache<K, V> newFIFOCache(int capacity, long timeout){return new FIFOCache<>(capacity, timeout);}/*** 创建FIFO(first in first out) 先进先出缓存.** @param <K> Key类型* @param <V> Value类型* @param capacity 容量* @return {@link FIFOCache}*/public static <K, V> FIFOCache<K, V> newFIFOCache(int capacity){return new FIFOCache<>(capacity);}/*** 创建LFU(least frequently used) 最少使用率缓存.** @param <K> Key类型* @param <V> Value类型* @param capacity 容量* @param timeout 过期时长,单位:毫秒* @return {@link LFUCache}*/public static <K, V> LFUCache<K, V> newLFUCache(int capacity, long timeout){return new LFUCache<>(capacity, timeout);}/*** 创建LFU(least frequently used) 最少使用率缓存.** @param <K> Key类型* @param <V> Value类型* @param capacity 容量* @return {@link LFUCache}*/public static <K, V> LFUCache<K, V> newLFUCache(int capacity){return new LFUCache<>(capacity);}/*** 创建LRU (least recently used)最近最久未使用缓存.** @param <K> Key类型* @param <V> Value类型* @param capacity 容量* @param timeout 过期时长,单位:毫秒* @return {@link LRUCache}*/public static <K, V> LRUCache<K, V> newLRUCache(int capacity, long timeout){return new LRUCache<>(capacity, timeout);}/*** 创建LRU (least recently used)最近最久未使用缓存.** @param <K> Key类型* @param <V> Value类型* @param capacity 容量* @return {@link LRUCache}*/public static <K, V> LRUCache<K, V> newLRUCache(int capacity){return new LRUCache<>(capacity);}/*** 创建定时缓存.** @param <K> Key类型* @param <V> Value类型* @param timeout 过期时长,单位:毫秒* @return {@link TimedCache}*/public static <K, V> TimedCache<K, V> newTimedCache(long timeout){return new TimedCache<>(timeout);}/*** 创建弱引用缓存.** @param <K> Key类型* @param <V> Value类型* @param timeout 过期时长,单位:毫秒* @return {@link WeakCache}* @since 3.0.7*/public static <K, V> WeakCache<K, V> newWeakCache(long timeout){return new WeakCache<>(timeout);}/*** 创建无缓存实现.** @param <K> Key类型* @param <V> Value类型* @return {@link NoCache}*/public static <K, V> NoCache<K, V> newNoCache(){return new NoCache<>();}
}

Cache接口具体方法:

/*** 缓存接口** @param <K> 键类型* @param <V> 值类型* @author Looly, jodd*/
public interface Cache<K, V> extends Iterable<V>, Serializable {/*** 返回缓存容量,{@code 0}表示无大小限制** @return 返回缓存容量,{@code 0}表示无大小限制*/int capacity();/*** 缓存失效时长, {@code 0} 表示没有设置,单位毫秒** @return 缓存失效时长, {@code 0} 表示没有设置,单位毫秒*/long timeout();/*** 将对象加入到缓存,使用默认失效时长** @param key    键* @param object 缓存的对象* @see Cache#put(Object, Object, long)*/void put(K key, V object);/*** 将对象加入到缓存,使用指定失效时长<br>* 如果缓存空间满了,{@link #prune()} 将被调用以获得空间来存放新对象** @param key     键* @param object  缓存的对象* @param timeout 失效时长,单位毫秒*/void put(K key, V object, long timeout);/*** 从缓存中获得对象,当对象不在缓存中或已经过期返回{@code null}* <p>* 调用此方法时,会检查上次调用时间,如果与当前时间差值大于超时时间返回{@code null},否则返回值。* <p>* 每次调用此方法会刷新最后访问时间,也就是说会重新计算超时时间。** @param key 键* @return 键对应的对象* @see #get(Object, boolean)*/default V get(K key) {return get(key, true);}/*** 从缓存中获得对象,当对象不在缓存中或已经过期返回Func0回调产生的对象* <p>* 调用此方法时,会检查上次调用时间,如果与当前时间差值大于超时时间返回{@code null},否则返回值。* <p>* 每次调用此方法会刷新最后访问时间,也就是说会重新计算超时时间。** @param key      键* @param supplier 如果不存在回调方法,用于生产值对象* @return 值对象*/default V get(K key, Func0<V> supplier) {return get(key, true, supplier);}/*** 从缓存中获得对象,当对象不在缓存中或已经过期返回Func0回调产生的对象* <p>* 调用此方法时,会检查上次调用时间,如果与当前时间差值大于超时时间返回{@code null},否则返回值。* <p>* 每次调用此方法会可选是否刷新最后访问时间,{@code true}表示会重新计算超时时间。** @param key                键* @param isUpdateLastAccess 是否更新最后访问时间,即重新计算超时时间。* @param supplier           如果不存在回调方法,用于生产值对象* @return 值对象*/V get(K key, boolean isUpdateLastAccess, Func0<V> supplier);/*** 从缓存中获得对象,当对象不在缓存中或已经过期返回{@code null}* <p>* 调用此方法时,会检查上次调用时间,如果与当前时间差值大于超时时间返回{@code null},否则返回值。* <p>* 每次调用此方法会可选是否刷新最后访问时间,{@code true}表示会重新计算超时时间。** @param key                键* @param isUpdateLastAccess 是否更新最后访问时间,即重新计算超时时间。* @return 键对应的对象*/V get(K key, boolean isUpdateLastAccess);/*** 返回包含键和值得迭代器** @return 缓存对象迭代器* @since 4.0.10*/Iterator<CacheObj<K, V>> cacheObjIterator();/*** 从缓存中清理过期对象,清理策略取决于具体实现** @return 清理的缓存对象个数*/int prune();/*** 缓存是否已满,仅用于有空间限制的缓存对象** @return 缓存是否已满,仅用于有空间限制的缓存对象*/boolean isFull();/*** 从缓存中移除对象** @param key 键*/void remove(K key);/*** 清空缓存*/void clear();/*** 缓存的对象数量** @return 缓存的对象数量*/int size();/*** 缓存是否为空** @return 缓存是否为空*/boolean isEmpty();/*** 是否包含key** @param key KEY* @return 是否包含key*/boolean containsKey(K key);/*** 设置监听** @param listener 监听* @return this* @since 5.5.2*/default Cache<K, V> setListener(CacheListener<K, V> listener){return this;}
}

使用:创建一个缓存对象,自动清理时间单位为毫秒,自动清理时间为3秒钟

    public static void main(String[] args) {TimedCache<String, BigDecimal> dataCache = CacheUtil.newTimedCache(3000);String k = "key";BigDecimal v = new BigDecimal("100");dataCache.put(k,v);System.out.println("第1次结果:" + dataCache.get(k));ThreadUtil.sleep(2000);System.out.println("第2次结果:" + dataCache.get(k));ThreadUtil.sleep(5000);System.out.println("第3次结果:" + dataCache.get(k));System.out.println("第3次结果-get方法:" + dataCache.get(k, () -> v)); //使用此方法,如果为空值就把数据重新赋值并且返回System.out.println("第4次结果:" + dataCache.get(k));}

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

11、数组

1、数组概念 数组就是存储多个相同数据类型的数据。 比如&#xff1a;存储26个字母&#xff0c;存储一个班级的学生成绩。 2、数组使用 数组要遵循先定义再使用 2.1、数组定义的格式 存储数据---空间 ---- 数据类型 多少个 --- 数据个数 >> 数据类型 数…

六、文本搜索工具(grep)和正则表达式

一、grep工具的使用 1、概念 grep&#xff1a; 是 linux 系统中的一个强大的文本搜索工具&#xff0c;可以按照 正则表达式 搜索文本&#xff0c;并把匹配到的行打印出来&#xff08;匹配到的内容标红&#xff09;。 2、语法 grep [options]…… pattern [file]…… 工作方式…

【python】爬去二手车数据 未完成

技术方案 python selenium 先下载Microsoft Edge WebDriver Microsoft Edge WebDriver 官网 先看一下自己的edge版本 搜索到版本然后下载自己的版本 安装依赖 pip install seleniumimport time from selenium import webdriverdriver webdriver.Edge(executable_pathr&qu…

玩游戏常常出现vc++runtime library error R6025 这是什么意思,该怎么解决?

当玩游戏时常常出现“vc runtime library error R6025”错误&#xff0c;这通常表明微软C开发运行库组件存在问题。以下是对该错误及其解决方法的详细解释&#xff1a; 错误含义 “vc runtime library error R6025”是一个与Visual C运行时库相关的错误&#xff0c;该错误表明…

【深度学习基础】一篇入门模型评估指标(分类篇)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…

深度学习基础02_损失函数BP算法(上)

目录 一、损失函数 1、线性回归损失函数 1.MAE损失 2.MSE损失 3.SmoothL1Loss 2、多分类损失函数--CrossEntropyLoss 3、二分类损失函数--BCELoss 4、总结 二、BP算法 1、前向传播 1.输入层(Input Layer)到隐藏层(Hidden Layer) 2.隐藏层(Hidden Layer)到输出层(Ou…

从技术视角看AI在Facebook全球化中的作用

在全球化日益加深的今天&#xff0c;人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正在深刻影响全球互联网巨头的发展方向。Facebook作为全球最大的社交媒体平台之一&#xff0c;正通过AI技术突破语言、文化和技术的障碍&#xff0c;推动全球化战略的实现…

41 基于单片机的小车行走加温湿度检测系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;滑动变阻器连接数码转换器模拟电量采集传感器&#xff0c; 电机采样L298N驱动&#xff0c;各项参数通过LCD1602显示&#x…

Python3 爬虫 Scrapy的使用

安装完成Scrapy以后&#xff0c;可以使用Scrapy自带的命令来创建一个工程模板。 一、创建项目 使用Scrapy创建工程的命令为&#xff1a; scrapy startproject <工程名> 例如&#xff0c;创建一个抓取百度的Scrapy项目&#xff0c;可以将命令写为&#xff1a; scrapy s…

【S500无人机】--地面端下载

之前国庆的时候导师批了无人机&#xff0c;我们几个也一起研究了几次&#xff0c;基本把无人机组装方面弄的差不多了&#xff0c;还差个相机搭载&#xff0c;今天我们讲无人机的调试 硬件配置如下 首先是地面端下载&#xff0c;大家可以选择下载&#xff1a; Mission Planne地…

Android -- 简易音乐播放器

Android – 简易音乐播放器 播放器功能&#xff1a;* 1. 播放模式&#xff1a;单曲、列表循环、列表随机&#xff1b;* 2. 后台播放&#xff08;单例模式&#xff09;&#xff1b;* 3. 多位置同步状态回调&#xff1b;处理模块&#xff1a;* 1. 提取文件信息&#xff1a;音频文…

常用端口与Udp协议

目录 1.再谈端口 1.1 五元组 1.2 端口号范围划分 1.3 两个指令 1.3.1 netstat 1.3.2 pidof 2.UDP协议 2.1 协议整体格式 2.2 udp特点 2.3 udo缓冲区 1.再谈端口 1.1 五元组 端口号表示了一个主机上进行通信的不同的应用程序&#xff1b;在Tcp/IP协议中&#xff0c;用…

计算机毕业设计SpringCloud+大模型微服务高考志愿填报推荐系统 高考大数据 SparkML机器学习 深度学习 人工智能 Python爬虫 知识图谱

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

C/C++ 数据结构与算法【线性表】 顺序表+链表详细解析【日常学习,考研必备】带图+详细代码

1&#xff09;线性表的定义 线性表&#xff08;List&#xff09;&#xff1a;零个或多个数据元素的有限序列。 线性表的数据集合为{a1,a2,…,an}&#xff0c;假设每个元素的类型均为DataType。其中&#xff0c;除第一个元素a1外&#xff0c;每一个元素有且只有一个直接前驱元素…

搭建AD域服务器

搭建AD域服务器 使用深信服HCI搭建AD域服务器 1、新建虚拟机 2、填写参数 3、省略安装过程 4、进入服务器管理器 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、 15、 16、 17、 18、 19、 20、 21、 22、 23、

【算法day4】链表:应用拓展与快慢指针

题目引用 两两交换链表节点删除链表的倒数第n个节点链表相交环形链表 1.两两交换链表节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&am…

【Gitlab】gitrunner并发配置

并发介绍 涉及到并发控制的一共有4个参数: concurrent , limit ,request_concurrency,parallel 全局的配置: [rootiZ2vc6igbukkxw6rbl64ljZ config]# vi config.toml concurrent 4 #这是一个总的全局控制&#xff0c;它限制了所有pipline&#xff0c;所有runner执行器…

vue 2 父组件根据注册事件,控制相关按钮显隐

目标效果 我不注册事件&#xff0c;那么就不显示相关的按钮 注册了事件&#xff0c;才会显示相关内容 实现思路 组件在 mounted 的时候可以拿到父组件注册监听的方法 拿到这个就可以做事情了 mounted() {console.log(this.$listeners, this.$listeners);this.show.search !…

四:工具、环境准备-compute node

一&#xff1a;工具、环境准备-controller node 二&#xff1a;OpenStack环境准备-controller node 三&#xff1a;安装服务-controller node 四&#xff1a;工具、环境准备-compute node 五&#xff1a;OpenStack环境准备-compute node 六&#xff1a;安装服务-compute node 七…

Vue3在PC端接入萤石云监控

参考文档&#xff1a;文档概述 萤石开放平台API文档 1.安装依赖 npm i ezuikit-js 2.封装组件 src/components/PlayerVideo/index.vue <template><div id"video-container" style"width: 100%;"></div> </template> <scrip…