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…

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

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

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;通过…

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…

Html5如何播放hls格式的视频

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

[数组] 子数组最大平均数

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于 10-5 的答案都将被视为正确答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,12,-5,-6,50,3], k 4 输出&#xff…

操作系统教材第6版——个人笔记5

3.2 单连续分区存储管理 3.2.1 单连续分区存储管理 单连续分区存储管理 每个进程占用一个物理上完全连续的存储空间(区域) 单用户连续分区存储管理固定分区存储管理可变分区存储管理 单用户连续分区存储管理 主存区域划分为系统区与用户区设置一个栅栏寄存器界分两个区域…

每日题库:Huawe数通HCIA——13

所有资料均来源自网络&#xff0c;但个人亲测有效&#xff0c;特来分享&#xff0c;希望各位能拿到好成绩&#xff01; PS&#xff1a;别忘了一件三连哈&#xff01; 今日题库&#xff1a; 186. 下列协议中属于动态IGP路由协议的是&#xff1f;-单选 A.stA.tiC. B.OSPF c…

使用Django Channels和WebSocket构建聊天应用

一、引言 WebSocket提供了一种在客户端和服务器之间进行实时双向通信的方式。结合Django Channels&#xff0c;我们可以轻松地在Django项目中实现WebSocket功能。本文将通过一个简单的聊天应用示例&#xff0c;展示如何使用Django Channels和WebSocket。 二、环境搭建 项目的…

Nacos的下载使用

下载 本地Java8Maven环境 下载地址 https://github.com/alibaba/nacos/releases使用 解压安装包&#xff0c;直接运行bin目录下的startup.cmd 账号密码都是nacos

Win32和c++11多线程

Win32和c11多线程 一、概念1.线程的特点线程内核对象线程控制块线程是独立调度和分派的基本单位共享进程的资源 2.线程的上下文切换引起上下文切换的原因 3.线程的状态 二、Windows多线程API1.CreateThread创建线程2.获取线程ID3.关闭线程句柄4.挂起线程5.恢复线程6.休眠线程的…