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

news/2024/11/17 5:24:37/

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.ppmy.cn/news/68892.html

相关文章

常用好用的远程连接工具分享

1、RayLink 介绍&#xff1a; RayLink它是一款功能强大的远程控制软件&#xff0c;支持Windows、macOS、IOS以及Android等多种操作系统。同时&#xff0c;它还提供了手机端和桌面端两种不同的应用程序&#xff0c;可以通过手机控制电脑&#xff0c;也可以通过电脑控制手机。这…

低分辨率视频可以变高分辨率吗?

近几年&#xff0c;老电影、老视频片段修复越来越常见了。很多优质的片源&#xff0c;因为年代久远&#xff0c;分辨率较低&#xff0c;画质比较差&#xff0c;通过视频超分技术&#xff0c;实现了画质增强&#xff0c;提高画质分辨率&#xff0c;视频画面变得更清晰了。 首先…

微信小程序学习实录2(下拉刷新、下拉加载更多、小程序事件、PHP后端代码、刷新无数据解决方案)

微信小程序学习实录2 一、全局配置1.启用lazyCodeLoading2.启用enablePullDownRefresh 二、设置全局变量三、页面初始化数据四、当前页面进入执行下拉刷新五、监听用户下拉动作六、页面上拉触底事件的处理函数七、PHP后端对接API八、常见问题1.不显示下拉加载...2.下拉不刷新数…

Centos-7安装步骤教程

提示&#xff1a; 鼠标移动到虚拟机内部单击或者按下Ctrl G&#xff0c;鼠标即可移入到虚拟机中&#xff0c;按下Ctrl Alt&#xff0c;鼠标即可移出虚拟机 目录 一、虚拟机的创建 1、创建新的虚拟机 2、选择典型&#xff0c;也可以自定义 3、安装程序光盘映像文件&#x…

数字零售不再是互联网的外衣,而是真正成为了数字零售本身

同互联网式的归宿仅仅只是以流量为主导&#xff0c;仅仅只是以规模的大小为终极追求不同&#xff0c;当数字化成为数字零售的终极归宿&#xff0c;我们看到的是&#xff0c;数字零售玩家们开始了一场寻找数字化与零售行业结合的新方式和新方法的新历程。在这样一个新历程下&…

【源码解析】@ControllerAdvice实现异常捕获与响应增强处理的原理解析

全局异常处理 demo展示 Slf4j RestControllerAdvice public class GlobalExceptionAdvice {ExceptionHandler(RuntimeException.class)public R<Void> handleNotPermissionException(RuntimeException e, HttpServletRequest request) {String requestURI request.get…

栈和队列的相关功能实现及其基础应用

前言&#xff1a;栈和队列是常见的数据结构&#xff0c;它们在计算机科学中被广泛应用。栈和队列都是一些元素的集合&#xff0c;它们的主要区别在于数据的组织方式和访问顺序。在栈中&#xff0c;元素的添加和删除都在同一端进行&#xff0c;称为栈顶&#xff0c;而在队列中&a…

Linux Shell 实现一键部署VMware Workstation

VMware Workstation 前言 VMware Workstation Pro 是业界标准的桌面 Hypervisor&#xff0c;用于在 Linux 或 Windows PC 上运行虚拟机 download VMware_Workstation VMware_Workstation WindowsVMware_Workstation linux文档downloaddownload参考 Linux 各系统下载使用参…