Caffine和Guava的refreshAfterWrite的异同

news2024/11/18 14:46:01

背景:

guava和caffine的refreshAfterWrite方法在用于本地缓存的场景是非常常用的,本文通过例子列举下caffine的refreshAfterWrite方法和guava的refreshAfterWrite的相同点和不同点

相同点/不同点:

以下都是使用key=XYZ作为例子

场景1:一开始缓存没有数据存在

1.1 caffine首次多线程获取key=XYZ的数据时,调用线程会去执行reload方法(如果没有显示定义,reload其实就是调用load方法)获取数据,而其他的线程会阻塞等待,对应代码BoundedLocalCache.doComputeIfAbsent方法如下:
在这里插入图片描述

1.2 guava首次多线程获取key=XYZ的数据时,调用线程会去执行reload方法(如果没有显示定义,reload其实就是调用load方法)获取数据,而其他的线程会阻塞等待,
在这里插入图片描述

也就是当首次加载key=XYZ的数据时,caffine和guava是一样的

场景二:当key=XYZ的数据已经存在

2.1 caffine多线程获取key=XYZ的数据时并假设已经大于等于刷新间隔时间时,这些线程都会获取到key=XYZ的旧值,不过此时会异步发起一个刷新操作,执行刷新操作的是默认线程池ForkJoinPool.commonPool(),也就是所有线程都不会被阻塞,但是他们的返回值都是上一轮的旧值
在这里插入图片描述
2.1 caffine多线程获取key=XYZ的数据时并假设已经大于等于刷新间隔时间时,这里又会分成两种场景

2.1.1 不提供自己的异步线程池,那么此时调用线程会被阻塞调用并返回新值,其余的线程直接返回旧值
在这里插入图片描述
2.1.2 业务提供线程池实现,那么此时所有线程都会返回旧值

在这里插入图片描述
注意:不论是caffine还是guava,他们触发refresh操作都是在真正去get获取数据的时候判断当前时间是否已经达到刷新时间点,如果是的话,对于caffine来说是通过执行ForkJoinPool.execute()方法执行reload,对于guava来说,调用线程直接调用reload方法/或者业务线程池使用线程池.execute执行reload方法,以上两者都不是我们通常意义上理解的类似ScheduleExecute.scheduleAtFixRatio的方法定时刷新的,他们不是按照固定频率由后台线程池主动触发执行的,而是由get获取操作触发的,只是说触发后由线程池来执行reload方法,这一点务必注意

总结:

由以上的不同点可知,如果一个key设定了刷新间隔比如1小时一次,但是这个key在一天的时间内并没有被访问,那么如果此时访问这个key,那么返回的key的值会是一天前刷新的那个旧值,并不是每小时更新的,切记, 只有这个key每小时都有被访问到才可以达到每小时都刷新的效果

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

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

相关文章

Linux网络编程:select函数的用法和原理

Linux网络编程:select函数的用法和原理 Linux上的select函数 select函数用于检测一组socket中是否有事件就绪.这里的事件为以下三类: 读事件就绪 在socket内核中,接收缓冲区中的字节数大于或者等于低水位标记SO_RCVLOWAT,此时调用rec或read函数可以无阻塞的读取该…

【Web UI自动化测试】Web UI自动化测试之框架篇(全网最全)

本文大纲截图: UnitTest框架: PyTest框架: 框架: 框架英文单词 framework,为解决一类事情的功能的集合。需要按照框架的规定(套路)去书写代码。 一、UnitTest框架介绍【文末分享自动化测试学…

报错:axios发送的所有请求都是404

axios发送的所有请求都是404 一、问题二、分析三、解决一、问题 对后台发送数据请求接口,在 Swagger 上是可以请求到的 但是通过 Ajax 发送请求就会报 404 Swagger 上调用如下 项目接口请求如下

深入MaxCompute -第十一弹 -QUALIFY

简介: MaxCompute支持QUALIFY语法过滤Window函数的结果,使得查询语句更简洁易理解。Window函数和QUALIFY语法之间的关系可以类比聚合函数GROUP BY语法和HAVING语法。 MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分…

【附安装包】3ds Max2023安装教程

软件下载 软件:3ds Max版本:2023语言:简体中文大小:6.85G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU3GHz 内存16G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.baidu.c…

【科普】干货!带你从0了解移动机器人(五) ( 如何选择控制器类型)

控制器是移动机器人(AGV/AMR)最主要的核心部件,是整个车体的“大脑”,关系到车体的可靠稳定、性能指标和安全性。它通常用于接收传感器模块采集的数据,并进行信息处理分析,从而下发各种运动指令的硬件。目前…

哪里可以找到优质的文章?

我认为中外科技内容过去主要是“信息差”,即人们可以直接从国外文章中摄取信息并直接实践,谁快谁赢。 而现在主要是“观点差”,国内科技相关的理论和评论文章的数量和质量都还比较弱。 所以,优质文章建议多找外文。 参考风险投资人…

django-项目

一、RESTful设计风格 基础概念 全称:Representational State Transfer 1.资源 网络上的一个实体,每个资源都有一个独一无二的URL与之对应;获取资源-直接访问URL即可 2.表现层 资源的表现形式 如HTML、xml、JPG、json等 3.状态转化 …

Kubernetes技术--部署实际的java项目部署

1.容器交付流程 (1).总体的流程如下所示: (2).k8s部署项目细节流程(详细过程) 2.java实际项目部署 (1).准备java项目,把项目打成jar包或者war包,这里需要依赖两个环境:jdk和maven环境。 使用mvn clean package进行打包,如下所示

2023年口腔医疗行业研究报告

第一章 行业概况 1.1 定义 口腔医疗行业是以口腔医疗服务消费为基础,包含医疗及消费双重属性,是 为满足口腔及颌面部疾病的预防和诊疗、口腔美容等需求提供相关医疗服务的行业。 该行业的主要参与者包括口腔保健专业人员(如牙医、口腔外科…

【重要】这是我见过最好的Flash科普文了

一、Flash Memory简介 Flash Memory 是一种非易失性的存储器。在嵌入式系统中通常用于存放系统、应用和数据等。在 PC 系统中,则主要用在固态硬盘以及主板 BIOS 中。 另外,绝大部分的 U 盘、SDCard 等移动存储设备也都是使用 Flash Memory 作为存储介质…

day 2

多态,虚函数,纯虚函数 1.多态:父类的指针或者引用,指向或初始化子类的对象,调用子类对父类重写的函数,进而展开子类的功能。 函数重写 1> 必须有继承关系 2> 子类和父类有同名同类型的函数 3>…

【深度学习实验】NumPy的简单用法

目录 一、NumPy介绍 1. 官网 2. 官方教程 二、实验内容 1. 导入numpy库 2. 打印版本号 3. arange 函数 4. array函数 5. reshape函数 6. 矩阵点乘(逐元素相乘) 7. 矩阵乘法 一、NumPy介绍 NumPy是一个常用于科学计算的Python库,尤…

司徒理财:8.31黄金高空低多布局静等非农来袭

黄金行情走势分析:      黄金现在处于底部震荡走势,反弹已经接近尾声,周五公布大非农数据,消息不确定的情况下,黄金不会轻易突破日线压力,今日将依托1950的压力位置做空看跌,看波段回调&…

【Python小项目】Python的GUI库Tkinter实现随机点名工具或抽奖工具并封装成.exe可执行文件

一、项目背景 受朋友所托,帮他在公司年会活动上做一个点名抽奖的小工具。经过沟通后,他发给我一个人员名单表格,是xlsx格式的excel工作表,并大概设计了一下抽奖工具的界面以及相关要求。话不多说,马上开始项目流程。 二、需求分析 客户需求总结如下: UI界面设计如下:…

SpringBoot之@RefreshScope

注解RefreshScope时一个组合注解。 Target({ ElementType.TYPE, ElementType.METHOD }) Retention(RetentionPolicy.RUNTIME) Scope("refresh") Documented public interface RefreshScope {// Scope代理模式之ScopedProxyMode,包含TARGET_CLASS、INTERF…

技术领导力实战笔记:14

14|团队优化:如何妥善且优雅地做好解聘工作? 我们需要在思想上对这件事情有一个正确的认识,解聘对团队、个人和管理者三方都是有好处的。摆正自己的立场才能做出正确的决定。 1.公司发展太快,个人没有跟上脚步 2.个人…

Go在安装Gin时出现Failed to connect 报错问题的解决方案(已解决)

在命令行中输入:go get -u github.com/gin-gonic/gin指令安装Gin第三方包时出现连接错误与连接超时的情况如下: 在较新版本的Go中引入了全新的包管理机制,出现上述错误可能是包管理机制设置不恰当的问题,尝试在终端窗口输入如下…

Mysql数据库(1)—索引

索引是什么? 索引是帮助MySQL高效获取数据的排好序的数据结构。常见的索引数据结构包括: 二叉树红黑树Hash表B-Tree mysql索引分类 按逻辑结构分类:B tree索引、Hash索引、Full-text索引。按物理存储分类: (1&…