hutool工具实践-缓存

简介

依赖引入

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-cache</artifactId><version>5.8.17</version></dependency>

hutool工具既可以像上一章hutool工具实践-验证码-CSDN博客所说直接全部引入,也可以分模块引入

使用示例

先进先出

    /*** FIFO(first in first out) 先进先出策略。* 元素不停的加入缓存直到缓存满为止,当缓存满时,* 清理过期缓存对象,清理后依旧满则删除先入的缓存(链表首部对象)。** 优点:简单快速 缺点:不灵活,不能保证最常用的对象总是被保留*/@Testpublic void fifoCacheTest() {Cache<String,String> fifoCache = CacheUtil.newFIFOCache(3);//加入元素,每个元素可以设置其过期时长,DateUnit.SECOND.getMillis()代表每秒对应的毫秒数,在此为3秒fifoCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);fifoCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);fifoCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);//由于缓存容量只有3,当加入第四个元素的时候,根据FIFO规则,最先放入的对象将被移除fifoCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);//value1为nullString value1 = fifoCache.get("key1");System.out.println(value1);}

过期时间缓存

 /*** 定时缓存,对被缓存的对象定义一个过期时间,当对象超过过期时间会被清理。* 此缓存没有容量限制,对象只有在过期后才会被移除。** @throws InterruptedException*/@Testpublic void timeCacheTest() throws InterruptedException {TimedCache<Object, Object> timeCache = CacheUtil.newTimedCache(1000);timeCache.put("userName","张三", DateUnit.MINUTE.getMillis());TimeUnit.SECONDS.sleep(1);Object userName = timeCache.get("userName");System.out.println(userName);}

如果用户在超时前调用了get(key)方法,会重头计算起始时间。举个例子,用户设置key1的超时时间5s,用户在4s的时候调用了get("key1"),此时超时时间重新计算,再过4s调用get("key1")方法值依旧存在。如果想避开这个机制,请调用get("key1", false)方法。

此缓存没有容量限制,对象只有在过期后才会被移除,如果启动了定时器(schedulePrune方法),那会定时清理缓存中的过期值,但是如果不起动,那只有在get这个值得时候才检查过期并清理。不启动定时器带来的问题是:有些值如果长时间不访问,会占用缓存的空间

最近最久未使用缓存

    /*** LRU (least recently used)最近最久未使用缓存。* 根据使用时间来判定对象是否被持续缓存,当对象被访问时放入缓存,当缓存满了,* 最久未被使用的对象将被移除。此缓存基于LinkedHashMap,因此当被缓存的对象每被访问一次,* 这个对象的key就到链表头部。这个算法简单并且非常快,他比FIFO有一个显著优势是经常使用的对象不太可能被移除缓存。* 缺点是当缓存满时,不能被很快的访问。*/@Testpublic void lruCacheTest() {Cache<String, String> lruCache = CacheUtil.newLRUCache(3);//通过实例化对象创建//LRUCache<String, String> lruCache = new LRUCache<String, String>(3);lruCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);lruCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);lruCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);lruCache.get("key1");//使用时间推近lruCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);//由于缓存容量只有3,当加入第四个元素的时候,根据LRU规则,最少使用的将被移除(2被移除)String value2 = lruCache.get("key"); //null}

最少使用率策略

    /*** LFU(least frequently used) 最少使用率策略。* 根据使用次数来判定对象是否被持续缓存(使用率是通过访问次数计算),* 当缓存满时清理过期对象,清理后依旧满的情况下清除最少访问(访问计数最小)的对象并将其他对象的访问数减去这个最小访问数,* 以便新对象进入后可以公平计数。*/@Testpublic void lfuCacheTest() {Cache<String, String> lfuCache = CacheUtil.newLFUCache(3);//通过实例化对象创建//LFUCache<String, String> lfuCache = new LFUCache<String, String>(3);lfuCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);lfuCache.get("key1");//使用次数+1lfuCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);lfuCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);lfuCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);//由于缓存容量只有3,当加入第四个元素的时候,根据LFU规则,最少使用的将被移除(2,3被移除)String value2 = lfuCache.get("key2");//nullString value3 = lfuCache.get("key3");//null}

说明

hutool的缓存策略均是基于缓存实现的,单独使用的机会较少(比较适合一些较为简单的单体项目),使用场景较多的情况是:结合redis等缓存技术做的多级缓存,提升系统性能

源码浅析

整个cache模块的核心接口在cn.hutool.cache.Cache,定义了缓存的相关方法

cache的模板实现是AbstractCache,在该抽象模板中实现了大部分方法,定义了最关键的方法:

putWithoutLock

其中pruneCache清理缓存的方法由后续子类根据各自的特征实现
getWithoutLock

实践案例

待补充

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

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

相关文章

短剧小程序剧场短剧APP定制开发付费短剧之为什么自建?

在当今数字时代&#xff0c;拥有一个属于自己的小剧场短剧影视小程序不仅是追求创作梦想的新途径&#xff0c;也是与观众建立紧密联系的有效方式。这种新兴的平台为创作者提供了前所未有的自由和机会&#xff0c;使他们能够直接与广大观众交流和分享作品。 1、源码分享的重要性…

搭贝请假审批应用

在现代企业管理中&#xff0c;高效的请假审批系统至关重要。搭贝的请假审批应用通过简化员工的请假流程、提升管理层的工作效率&#xff0c;确保企业运作的连贯性和透明度。本文将介绍搭贝请假审批应用的主要功能模块&#xff1a;请假分析看板、请假申请审批流、请假类型维护和…

依赖注入方式和自动加载原理

依赖注入 Spring提供了依赖注入的功能&#xff0c;方便我们管理和使用各种Bean&#xff0c;常见的方式有&#xff1a; 字段注入&#xff08;Autowired 或 Resource&#xff09;构造函数注入set方法注入 在以往代码中&#xff0c;我们经常利用Spring提供的Autowired注解来实现…

elk:使用filebeat采集日志发送到kafka

# 安装 filebeat 下载 cd /chz/install/filebeat wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.13.4-linux-x86_64.tar.gz解压 tar zxvf filebeat-8.13.4-linux-x86_64.tar.gz修改配置文件 cd /chz/install/filebeat/filebeat-8.13.4-linux-x86…

AIGC笔记--Stable Diffusion源码剖析之FrozenCLIPEmbedder

1--前言 以论文《High-Resolution Image Synthesis with Latent Diffusion Models》 开源的项目为例&#xff0c;剖析Stable Diffusion经典组成部分&#xff0c;巩固学习加深印象。 2--FrozenCLIPEmbedder 在默认提供的 txt2img.py 中&#xff0c;使用固定权重的 CLIP 模型来将…

LeetCode|1302. Deepest Leaves Sum

. 题目 Given the root of a binary tree, return the sum of values of its deepest leaves. Example 1: Input: root [1,2,3,4,5,null,6,7,null,null,null,null,8]Output: 15 Example 2: Input: root [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]Output: 19 Constr…

在Linux上的Java项目导出PDF乱码问题

在Linux上的Java项目导出PDF乱码问题 场景&#xff1a;一个Java项目导出PDF&#xff0c;在我本地导出是没有问题&#xff0c;但是部署上Linux上后&#xff0c;导出就出现了乱码了。 处理方案 我这里使用的处理方案是在Linux服务器上安装一些PDF需要使用的字体 1.把字体上传到…

JavaScript第十一讲:DOM编程“事件”练习题

前言 上一节有本部分的内容讲解&#xff0c;有需要的码客们可以看看 练习题描述&#xff1a; 编写一个HTML表单&#xff0c;用户可以在其中输入一个账号。当用户点击“检查账号”按钮时&#xff0c;使用JavaScript来验证该账号是否存在于一个预定义的账号列表中。如果存在&am…

ubuntu 22.04 整机灾备方案

在Ubuntu 22.04上进行每日整机灾备的详细步骤包括配置自动化备份脚本、设置定时任务、并将备份数据存储到远程位置。以下是完整的步骤&#xff1a; 1. 安装必要的软件 1.1 更新操作系统 确保操作系统和所有软件包是最新的&#xff1a; sudo apt update sudo apt upgrade -y…

Apache POI(使用Java读写Excel表格数据)

1.Apache POI简介 Apache POI是一个开源的Java库&#xff0c;用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能&#xff0c;包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API&#xff0c;使得Java开发者能够…

course-nlp——8-translation-transformer

本文参考自https://github.com/fastai/course-nlp。 注意力机制和 Transformer Nvidia AI 研究员 Chip Huyen 写了一篇很棒的文章《Top 8 trends from ICLR 2019》&#xff0c;其中的趋势之一是 RNN 正在失去研究人员的青睐。 这是有原因的&#xff0c;RNN 可能很麻烦&#…

【Qt】Qt QTreeWidget隐藏列名称(横向表头)

1. 效果 未隐藏 隐藏 2. 方法 方法1 ui->treeWidget->header()->hide();方法2 ui->treeWidget->header()->setVisible(false);

Go语言升级1.22.0版本VSCode启动调试报 Version of Go is too old for this version of Delve

因为项目中调用了其它同事的服务&#xff0c;该服务同事的Go环境是1.22.0&#xff0c;我本地go环境是Go1.20.6&#xff0c;不得已也升级了go的版本到1.22.0&#xff0c;其实升级很简单&#xff0c;只需要去go官网下载windows环境的zip包&#xff0c;把原来配置的环境变量GOROOT…

计算机科学(学习笔记三)

内容来源&#xff1a;计算机科学 指令和程序 指令&#xff1a;指示计算机要做什么的代码&#xff0c;多条指令共同组成程序。 计算机指令长度 由于早期计算机每个字只有8位&#xff0c;指令只占4位&#xff0c;意味着只能有16个指令&#xff0c;这远远不够。 现代计算机有两…

[个人总结]-java常用方法

1.获取项目根路径 user.dir是一个系统属性&#xff0c;表示用户当前的工作目录&#xff0c;大多数情况下&#xff0c;用户的当前工作目录就是java项目的根目录&#xff08;src文件的同级路径&#xff09; System.getProperty("user.dir") 结果&#xff1a;D:\code…

C++实现,简单的命令行交互框架

目录 背景 背景 在实际开发中&#xff0c;经常需要有对端测试程序&#xff0c;配合自己的程序&#xff0c;验证功能、逻辑等。面对繁杂、多变的需求&#xff0c;如果对端程序设计得不够灵活&#xff0c;则无法提升工作效率&#xff0c;如果能够与对端程序交互&#xff0c;通过…

嵌入式系统错误处理与日志记录

在嵌入式系统中&#xff0c;错误处理和日志记录是确保系统稳定性和可维护性的关键组成部分。有效的错误处理策略可以减少系统故障&#xff0c;而详尽的日志记录可以帮助开发者快速定位问题原因。本文将探讨嵌入式系统中的错误处理机制和日志记录策略&#xff0c;并提供相应的代…

Spring Cloud 微服务集成Sentinel实现服务熔断降级

文章目录 一、前言二、技术思路及方案2.1 实现思路2.2 实现方案2.2.1 nacos动态数据源实现类关系图 三、功能实现3.1 快速集成方案3.1.1 引入依赖3.1.2 服务端熔断降级3.1.3 feign调用降级 四、扩展4.1 SPI机制4.2 自定义Slot实现4.3 基于 Sentinel 实现 Feign 全局异常兜底4.3…

ubuntu, esp-idf, arduino

1&#xff0c; 把 esp-idf 文件夹拷贝到 ubuntu&#xff0c; 不是拷贝 zip。 这样做是为了在 ubuntu 里能检测到 git 2&#xff0c; 把 esp-idf 里的 hello-world 拷贝出来 3&#xff0c; 在 hello-world 里建立文件夹 components, 把 arduino 文件夹拷贝进去 esp-idf 和 ar…

Html5如何播放hls格式的视频

目录 一、什么情况下需要播放 二、hls的原理 1、 切片 2、编码 3、分发 4、M3U8文件 5、客户端请求 6、动态码率调整 7、缓存 8、实时性 三、方法一&#xff1a;使用hls.js播放 四、方法二&#xff1a;使用video.js播放 一、什么情况下需要播放 当前端需要嵌入设备视…