源码解读guava cache get接口的秘密

news2025/1/20 3:34:40

guava cache是谷歌开源的一种本地缓存,实现原理类似于ConcurrentHashMap,使用segments分段锁,保证线程安全,支持高并发场景。同时支持多种类型的缓存清理策略,包括基于容量的清理、基于时间的清理、基于引用的清理等。

这里要讲是 它的cache下的get接口:

V get(K key, Callable<? extends V> loader) throws ExecutionException;

 这个接口有个注意点:如上英文圈红部分: if cached,return;otherwise create,cache and return.

意思就是: 查询缓存:如果有记录,就返回该记录;如果没有,就创建记录,并缓存起来,然后返回。

实际应用场合也确实是这么用的,如下面的代码:

但是这种机制是怎么实现的,特别是:如果查询不到key对应的值,就通过函数loader创建,这个具体是如何通过代码实现的,下面就通过源码来分析:

首先跟进上面SETTERS的build方法

发现是通过 LocalCache.LocalManualCache方法创建的,

所以cache.get方法的实现类也是LocalManualCache

 跟进LocalManualCache.get方法,点击加号展开CacheLoader所在行的lambda表达式,查看它具体覆写了什么抽象方法/接口

这里实际是覆写了抽象类CacheLoader的load方法:get不到key值时,通过调用valueLoader的call方法获取到key值(valueLoader是一个Callable函数式接口,通过call方法可以调用它的接口实现)

但问题的关键是:在代码层面什么时候才会调用valueLoader的call方法,执行的时机是什么,具体机制是什么?

考虑到valueLoader.call方法是在覆写CacheLoader的load方法里面实现的,所以问题转换成==》CacheLoader的load方法是在什么时候被触发执行的?

 继续跟进localCache.get方法, 跟进到 它里面的segmentFor(hash).get方法

 可以看到:get不到key值时,必然进入lockedGetOrLoad方法

 跟进lockedGetOrLoad方法,进入下图中的loadSync方法

 跟进loadSync方法,进入其中的loadFuture方法(这里明显就是个异步回调)

loadFuture方法里面可以看到 CacheLoader的load方法的调用

 而 CacheLoader.load方法 的执行意味着前面的valueLoader函数的call方法执行:

因为localCache.get方法的入参valueLoader实际是覆写了CacheLoader.load方法,并在load方法中执行了valueLoader.call().

这也就回答了: 当Cache get不到key时,会从valueLoader函数的返回结果获取key值

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

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

相关文章

WPF基础使用

wpfwindows presentation foundation 官方文档 https://learn.microsoft.com/zh-cn/dotnet/api/?viewnet-7.0 一&#xff1a;WPF窗口设置为透明 在wpf中要将窗口设置为透明&#xff0c;除了将窗口背景色的Alpha分量设置为0以外&#xff0c;你还必须将窗口的AllowsTransparency…

STM32串口编程基础知识讲解

文章目录 前言一、串行通信和并行通信二、全双工&#xff0c;半双工&#xff0c;单工传输三、同步通信和异步通信四、波特率总结 前言 本篇文章给大家介绍一下串口的基础编程知识&#xff0c;这些知识是属于串口的理论知识&#xff0c;在开始学习编写代码的时候必须要掌握这些…

消息队列中间件 - RabbitMQ消息的持久化、确认机制、死信队列

持久化和应答机制Ack 消息队列中间件系列的最后一篇了&#xff0c;RabbitMQ消息的持久化、确认机制、死信队列、负载均衡等一系列进行说明。 消息持久化 当RabbitMq重启以后&#xff0c;未消费的消息&#xff0c;可以在服务重启后继续消费&#xff0c;不会丢失。 应答机制A…

nodejs处理xlsx文件生成json文件

nodejs处理xlsx文件有好几种方式&#xff0c;这里用的是js-xlsx库&#xff1b; 需求 有一个 xlsx 的文件&#xff0c;里面有几个不同的 sheet&#xff0c;需要读取这个表格中不同 sheet 的数据&#xff0c;并且为每个 sheet 生成对应的 json 文件。 例如有一个名为 template…

草根测试员的涨薪之路:我是如何从0到月薪20K的?(仅供借鉴)

我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触多了&#xff0c;吃个饭…

网络安全:Hydra 端口爆破工具.(九头蛇)

网络安全&#xff1a;Hydra 端口爆破工具.&#xff08;九头蛇&#xff09; Hydra 也叫九头蛇&#xff0c;是一款开源的暴力PJ工具&#xff0c;集成在kali当中。可以对多种服务的账号和密码进行爆破&#xff0c;包括 Web 登录、数据库、SSH、FTP 等服务. 目录&#xff1a; 网络…

内网渗透—域防火墙策略同步、不出网隧道上线

内网渗透—域防火墙策略同步、不出网隧道上线 1. 前言2. 域防火墙2.1. 域控开启防火墙同步测试2.1.1. 查看域主机防火墙策略2.1.2. 域控防火墙策略下发同步2.1.2.1. 创建组策略2.1.2.2. 编辑组策略2.1.2.3. 编辑防火墙2.1.2.4. 同步防火墙策略 2.2. 域控出入站规则同步2.2.1. 查…

【数据结构】队列及其实现

目录 &#x1f60e;前言 认识队列 队列的初始化 队列判空 数据队尾入队 数据队头出队 取队头数据 取队尾数据 队列数据的个数 队列销毁 总结 &#x1f60e;前言 上次我们学习了栈及其实现&#xff0c;当然也少不它的好兄弟队列啦&#xff0c;今天我们开始队列的学习队…

大模型Founation Model

一、背景 自从chatgpt&#xff0c;gpt4以特别好的效果冲入人们的视野中&#xff0c;也使得AI产业发生了巨大变革&#xff0c;从17年以来的bert&#xff0c;将AI的各种领域都引入bert类的fine-tune方法&#xff0c;来解决单个领域单个任务的一一个预训练模型。在学术界和工业界…

Redis---事务管道

目录 一、Redis的事务是什么&#xff1f; 1.1 Redis和关系型数据库事务的区别 二、怎么玩Redis事务&#xff1f; 2.1 正常执行&#xff1a; 2.2 放弃事务 2.3 全体连坐 2.4 冤头债主 2.5 watch监控 三、管道 3.1 为什么会引入管道这个概念呢&#xff1f;我们首先来看一…

前后端分离项目部署上线流程-和错误解决

需求&#xff1a;就是想把自己写的前后端项目传上去不再是只有本地可以访问&#xff0c;其他人也可以访问我这个项目&#xff0c;以此记录免得后面搞忘了&#xff0c;文章很长&#xff0c;也很细&#xff0c;我自己上线碰到的错误也会发一下&#xff0c;建议看完哦 1.首先买个…

U盘连接电脑不显示怎么办?

对于很多Windows 11/10/8/7系统下的用户&#xff0c;U 盘、SD卡或其他移动硬盘未检测到或磁盘管理中不显示&#xff0c;这是一个非常普遍的问题。下面我们就来了解一下出现这种情况的常见原因和解决办法。 为什么U盘没有显示在磁盘管理中&#xff1f; U盘在电脑磁盘管理中不显…

GPT专业应用:生成实习报告

正文共 1070 字&#xff0c;阅读大约需要 4 分钟 大学生必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 快速生成实习报告 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由…

旅游网站设计方案

针对涉旅企业的旅游网站设计&#xff0c;主要要考虑以下几点&#xff1a; 1、考虑网站的业务开展需求&#xff0c;能够有效将衣、食、住、行、游、购、娱融合在一起&#xff0c;满足旅游企业的业务开展需求。 2、网站的设计结构&#xff0c;符合目前的网站开发结构&#xff0c;…

vue3鼠标经过显示按钮

在前端开发中&#xff0c;我们经常需要在页面中添加一些交互效果来提升用户体验。其中一个常见的需求就是鼠标经过某个元素时显示一个按钮&#xff0c;这个按钮可以用于触发一些操作或者显示更多的内容。 在本篇文章中&#xff0c;我将会介绍如何使用 Vue3 实现一个鼠标经过显…

七人拼团系统开发模式常见问题详解

七人拼团模式最近在市场上非常火爆&#xff0c;很多企业商家都在用这个模式。但同时也有很多人对这个模式不太了解&#xff0c;纷纷私信问我&#xff0c;今天就在这里简单说一下七人拼团模式的常见问题。 1、什么是七人拼团&#xff1f; 七人拼团就是用户购买专区礼包后&#…

Redis的数据类型

参考文档&#xff1a;https://www.runoob.com/redis/redis-tutorial.html redis当中一共支持五种数据类型&#xff0c;分别是&#xff1a; string字符串 list列表 set集合 hash表 zset有序集合 1、对字符串string的操作 下表列出了常用的 redis 字符串命令 1 设置值 获取…

报错:To install it, you can run : npm install --save @api/***解决方法

启动项目时&#xff0c;控制台报错&#xff0c;在此记录一下 以下是报错原因: 报错信息如下 To install it, you can run: npm install --save /api/tNursingStaffCirculation Proxy error: Could not proxy request auth/code from localhost:8013 to http://local. See ht…

【下载】【you-get】用电脑下载网页视频

分享一下&#xff0c;此方法是在网络上看到的&#xff0c;但忘了出处。 一、前提 电脑安装了python软件&#xff0c;版本无要求。建议上官网下载软件。记得配置好环境&#xff08;将pyhton的scripts文件夹的路径加到用户变量里&#xff09;。 二、方法 1、安装you-get库 &am…

本周精彩!关于 Linux 内核宕机和超融合 Kata 虚拟化容器技术介绍 | 第 77-78 期

本周「龙蜥大讲堂」预告来啦&#xff01;我们邀请了系统运维 SIG Contributor 刘馨蔚分享《Linux 内核宕机介绍和简单分析思路》&#xff0c;浪潮数据超融合云原生工程师王永超分享《超融合产品中的 Kata Containers》主题演讲&#xff0c;精彩多多&#xff0c;快来扫码入群&am…