作为 java 开发工作者,相信大家对于 guava 这个工具包都不会太陌生,而对于本地缓存技术 guava cache,大家在日常的工作开发中也都有所了解,接下来本文就从各个角度入手来对于 Google 提供的 guava cache 进行解析。
本地缓存的数据读写都在一个进程内,相对与 redis 等分布式缓存,不需要网络传输的过程,访问速度很快,同时也受到 JVM 内存的制约,无法在数据量较多的场景下使用。
基于以上特点,guava cache 的主要应用场景为以下几种:
在这里 guava cache 被用于储存参数配置,也符合以上的应用场景条件。
guava cache 位于 com.google.common.cache 包下,核心的类有两个,一个是 CacheBuilder,是用来构建缓存的,另一个是 Cache,也就是缓存容器,用来存放缓存数据的。
要使用 guava cache,首先要引入 maven 依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
接下来写一个简单的示例:
Cache<String, String> localCache = CacheBuilder.newBuilder()
.initialCapacity(5)
.maximumSize(10)
.concurrencyLevel(3)
.expireAfterWrite(10, TimeUnit.SECONDS)
.build();
以上示例实例化了一个本地缓存,接下来介绍一下初始化的各项参数的含义:
initialCapacity:内部哈希表的最小容量,也就是 cache 的初始容量。
maximumSize:cache 的最大缓存数。
concurrencyLevel:并发等级,也可以定义为同时操作缓存的线程数,由
可以看出,这个线程数默认为 4。
expireAfterWrite:缓存写入后刷新时间。
从缓存中获取数据调用的方法为 get (K key, Callable<? extends V> loader) 方法,此方法的含义是根据键 key 获取数据,若 key 不存在,则通过执行指定的 Callable 方法来构造缓存,示例代码如下所示:
Map<String, Dicdetail> dicDetailMap = ObLocateCache.locateConfigCache.get(key.toString(), new Callable<Map<String, Dicdetail>>() {
@Override
public Map<String, Dicdetail> call() throws Exception {
return getConfigParameterFromMaster(baseDomain, KeyConstants.WMS5_LOCATE_MANUAL);
}
});
从 cache 中删除数据分为被动删除和主动删除两种:
1. 被动删除:
2. 主动删除:
//删除指定的key对应数据
cache.invalidate("s");
//将一批对应的数据删除
cache.invalidateAll(Arrays.asList("st","r","ing"));
//全部删除
cache.invalidateAll();
guava cache 的数据结构跟 ConcurrentHashMap 类似,二者最基本的区别是 ConcurrentMap 会一直保存所有添加的元素,直至将添加的元素移除。相对地,guava cache 为了限制内存占用,通常都设定为自动回收元素。
guava cache 的核心类为 LocalCache,LocalCache 实现了 ConcurrentMap 接口。其中有一个 Segment 数组,如下所示
获取数据的方法源码如下图所示,可以看出 guava cache 的存储原理为由 Segment 数组加上 ReferenceEntry 链表加上 AtomicReferenceArray 数组组成的数据结构。
数据结构图如下所示:
Segement 数组的长度决定了 cache 的并发数。每一个 Segment 都继承了 ReentrantLock,使用了单独的锁,对 Segment 的写操作需要先拿到锁。写操作部分源码如下所示:
本文简要叙述了 guava cache 的应用场景以及简单的使用方式,通过源码对于 guava cache 的存储原理以及简单的读写方法进行了介绍。相信通过阅读本文,能够对于常见的 guava cache 有一个大致的认知。
作者:京东物流 王辰玮
来源:京东云开发者社区 自猿其说 Tech
原网址: 访问
创建于: 2023-10-07 16:49:29
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论