Google Guava Cache简介
目录
- 简介
- 和Redis的区别
简介
Google Guava 是一个开源的 Java 库,其中提供了一系列强大的工具来简化 Java 开发工作。其中,Guava Cache 组件提供了一个内存缓存的实现,可以显著提高应用程序的性能。这是一个高效且灵活的缓存解决方案,适用于各种场景。
以下是 Guava Cache 的一些关键特性:
自动加载数据:通过提供一个 CacheLoader,缓存可以在键不存在时自动加载所需的数据。
缓存失效策略:Guava Cache 提供了丰富的失效策略,比如基于时间的过期、基于容量的回收、权重回收等,可以根据需求进行配置。
并发处理:Guava Cache 内部使用了高效的并发数据结构,以提高性能并确保多线程环境下的安全操作。
统计信息:可以收集各种缓存操作的统计数据,比如命中率、加载时间等,这有助于监控和优化缓存的性能。
事件通知:支持对缓存中的项目过期或被逐出时进行通知,这样你可以进行相应的处理。
com.google.common.cache.CacheBuilder、CacheLoader 和 LoadingCache 是 Google Guava 库中的核心类,用于高效地创建和管理缓存。在 Java 应用程序中,缓存可以显著提高性能,减少延迟和对后端数据存储的压力。以下是这三个类的详细介绍:
1.CacheBuilder
介绍:
CacheBuilder 类用于创建和配置缓存的各项属性,比如缓存大小、超时时间和并发级别等。它是构建缓存的入口点,可以通过一系列方法进行链式调用来设置缓存参数。
常用方法:
maximumSize(long size):设置缓存的最大大小。当缓存项超过这一限制时,会使用最近最少使用(LRU)策略移除旧项。
expireAfterWrite(long duration, TimeUnit unit):设置缓存项在指定时间后过期,时间从缓存项创建或最近一次更新开始计算。
expireAfterAccess(long duration, TimeUnit unit):设置缓存项在指定时间内未被访问后过期。
removalListener(RemovalListener<K, V> listener):设置移除监听器,在缓存项被移除时触发回调。
build(CacheLoader<K, V> loader):与 CacheLoader 结合,用于创建 LoadingCache 实例。
2.CacheLoader
介绍:
CacheLoader 用于定义缓存项的加载逻辑。当缓存中某个键的值为空或过期时,CacheLoader 的 load 方法将会被调用来加载该键对应的值。
常用方法:
V load(K key):这是一个抽象方法,必须被实现,用于定义如何加载指定键的值。
Map<K, V> loadAll(Iterable<? extends K> keys):批量加载多个键值对,提供批量加载逻辑,有助于提高性能(可选实现)。
3.LoadingCache
介绍:
LoadingCache 是一种特殊类型的缓存,它继承自 Cache 接口,并且结合 CacheLoader 实现了自动加载功能。当请求的键在缓存中不存在时,LoadingCache 会自动加载并缓存该键。
常用方法:
V get(K key):获取指定键的值。如果键不存在,自动调用 CacheLoader 加载并缓存该值。
V getUnchecked(K key):类似 get 方法,但不会抛出检查型异常(仅适用于不会抛出异常的 CacheLoader 实现)。
void put(K key, V value):显式将键值对放入缓存中。
void invalidate(K key):使指定键失效,从缓存中移除。
void invalidateAll():使所有键失效,从缓存中清空所有项。
使用示例:
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.concurrent.TimeUnit;public class CacheExample {public static void main(String[] args) throws Exception {// 创建CacheLoaderCacheLoader<String, String> loader = new CacheLoader<String, String>() {@Overridepublic String load(String key) throws Exception {return expensiveOperation(key);}};// 使用CacheBuilder配置缓存LoadingCache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100) // 设置最大缓存条目数.expireAfterWrite(10, TimeUnit.MINUTES) // 设置缓存项过期时间.build(loader);// 使用缓存String value = cache.get("key1"); // 如果缓存中没有key1,则调用expensiveOperation方法加载}private static String expensiveOperation(String key) {// 模拟一个代价较高的计算操作return "value_of_" + key;}
}
总结
CacheBuilder:用于配置和构建缓存实例。
CacheLoader:用于定义缓存项的加载逻辑。
LoadingCache:结合 CacheLoader 实现自动加载的缓存,管理缓存项的生命周期。
通过使用这些类,可以轻松地实现高效的缓存机制,从而提升应用程序的性能。
和Redis的区别
Google Guava Cache 和 Redis 都是用来提升访问效率的缓存工具,但它们在实现方式、使用场景和配置上有很大的不同。以下是它们的详细对比及适用场景:
Google Guava Cache:
存储位置
Guava Cache 存储在本地 JVM 内存中。
特点
轻量级:Guava Cache 是一个轻量级的缓存库,易于集成和配置。
高速访问:因为缓存是在内存中的,所以读取速度非常快,无需网络开销。
自动过期:支持缓存项的自动过期(基于时间)和自动清理。
有限大小:支持配置缓存的最大条目数,超过限制时会自动移除旧项。
适用场景
单机应用:适用于不需要在多个实例间共享的缓存场景,如单台服务器上缓存用户会话或配置数据等。
低延迟:需要极低的访问延迟,对性能要求极高的应用。
轻量级缓存:数据量较小、对一致性要求不高的数据。
Redis:
存储位置
Redis 是一个基于内存的分布式数据存储系统,通常部署在独立的服务器或集群上,可以持久化到磁盘。
特点
分布式缓存:支持多实例之间的数据共享,可以作为分布式缓存使用。
持久化:支持将数据持久化到磁盘,避免因重启或崩溃丢失数据。
丰富的数据结构:支持字符串、哈希、列表、集合、有序集合等多种数据结构,功能丰富。
高并发:能够处理高并发访问,适用于大规模的互联网应用。
适用场景
分布式系统:适用于需要在多个服务器实例间共享缓存数据的场景,如微服务架构中的分布式会话管理。
大数据量:需要缓存大量数据且数据量超过单机内存限制时。
高可用和持久化:需要数据的高可用性和持久化支持,如缓存热点数据、防止缓存雪崩等场景。
主要区别及适用场景对比
| 特性 | Google Guava Cache | Redis |
|---|---|---|
| 存储位置 | 本地内存 | 独立服务器或集群(分布式) |
| 访问速度 | 低延迟,高速内存访问 | 相对较慢,需要网络访问,但仍旧高效 |
| 分布式支持 | 不支持 | 支持 |
| 持久化 | 不支持 | 支持 |
| 数据结构 | 简单的键值对存储 | 丰富的数据结构(字符串、哈希、列表等) |
| 适用场景 | 单机应用、低延迟、本地缓存 | 分布式系统、大数据量、高可用要求 |
| 配置和管理 | 简单,轻量级 | 相对复杂,需要配置和管理服务器或集群 |
总结
Google Guava Cache:适用于单机环境下的缓存需求,尤其是在需要低延迟访问的情况。如果你的应用是单节点,缓存的数据量适中,并且不需要分布式功能,那么 Guava Cache 是一个非常好的选择。
Redis:适用于分布式系统或需要持久化的缓存需求,可处理大规模、高并发的访问。如果你的应用需要在多个节点间共享缓存,大量数据的缓存,或者需要丰富的数据结构功能,Redis 是更好的选择。
在实际应用中,可以根据具体需求选择合适的缓存工具,并且在一些场景中,Guava Cache 和 Redis 可以互相补充。例如,可以在本地使用 Guava Cache 实现一级缓存,在 Redis 中实现二级缓存,进一步优化系统性能。
相关文章:
Google Guava Cache简介
目录 简介和Redis的区别 简介 Google Guava 是一个开源的 Java 库,其中提供了一系列强大的工具来简化 Java 开发工作。其中,Guava Cache 组件提供了一个内存缓存的实现,可以显著提高应用程序的性能。这是一个高效且灵活的缓存解决方案&#…...
githup开了代理push不上去
你们好,我是金金金。 场景 git push出错 解决 cmd查看 git config --global http.proxy git config --global https.proxy 如果什么都没有,代表没设置全局代理,此时如果你开了代理,则执行如下,设置代理 git con…...
【python】保存列表、字典数据到本地文件,以txt、json和pickle为例
Python保存列表、字典数据到本地文件(txt, json, pickle) 在Python编程中,我们经常需要将数据(如列表、字典等)保存到本地文件,以便后续读取、分析或与其他系统交换数据。Python提供了多种格式来保存这些数…...
每日新闻掌握【2024年7月9日 星期二】
2024年7月9日 星期二 农历六月初四 大公司/大事件 上半年新注册登记的新能源汽车创历史新高 据公安部统计,上半年新注册登记新能源汽车439.7万辆,同比增长39.41%,创历史新高。新能源汽车新注册登记量占汽车新注册登记量的41.42%。截至6月底…...
数据结构——Trie
题目: 维护一个字符串集合,支持两种操作: I x 向集合中插入一个字符串 x𝑥;Q x 询问一个字符串在集合中出现了多少次。 共有 N𝑁 个操作,所有输入的字符串总长度不超过 10^5,字符串仅…...
前端根据目录生成模块化路由routes
根据约定大于配置的逻辑,如果目录结构约定俗成,前端是可以根据目录结构动态生成路由所需要的 route 结构的,这个过程是要在编译时 进行,生成需要的代码,保证运行时的代码正确即可 主流的打包工具都有对应的方法读取文…...
Blender新手入门笔记收容所(一)
基础篇 基础操作 视角的控制 控制观察视角:鼠标中键平移视图:Shift鼠标中键缩放视图:滚动鼠标中键滚轮 选中物体后:移动物体快捷键G,移动后单击鼠标就会定下来。 进入移动状态后:按Y会沿着Y轴移动进入移动…...
修改服务器挂载目录
由于我们的项目通常需要挂载一个大容量的数据盘来存储文件数据,所以我们每台服务器都需要一个默认的挂载目录来存放这些数据,但是由于我们的误操作,导致挂载目录名字建错了,这时候后端就读不到挂载目录了,那我们我们的…...
Linux+InternStudio 关卡
ssh连接 端口映射 本地...
如何提升美国Facebook直播的整体体验?
Facebook作为全球最大的社交媒体平台之一,提供了直播功能,用户可以实时分享生活、见解和创意。许多商家通过美国Facebook直播来获取更多客户,但直播时可能会遇到网络卡顿的问题,导致观看体验不佳。本文将探讨如何解决这个问题&…...
flutter项目与原生项目相比,性能比较差的原因
Flutter 项目相对于原生项目有时会表现出性能上的差异,主要原因如下: 1. 框架层的额外开销 Flutter 是一个跨平台框架,它通过 Dart 语言编写代码,并使用 Flutter 引擎将其编译成原生代码。这种跨平台的抽象层不可避免地会引入一…...
第二周:李宏毅机器学习笔记
第二周学习周报 摘要Abstract一、深度学习1.Backpropagation(反向传播)1.1 链式法则1.2 Forward pass(前向传播)1.3 Backward pass(向后传播)1.4 总结 2. Regression(神奇宝贝案例)2…...
搜维尔科技:【研究】Scalefit是一款可在工作场所自动处理3D姿势分析结果的软件
Scalefit是一款可在工作场所自动处理 3D 姿势分析结果的软件。这甚至可以在衡量员工的同时发生。然后,Scalefit 根据国际标准对姿势、压缩力和关节力矩进行分析和可视化。 3D姿势分析 如今,Xsens 技术可让您快速测量工作场所员工的态度。一套带有 17 个…...
网络编程:各协议头(数据报格式)
一、mac头 二、ip头 protocol——tcp/udp (7)TTL——生存时间 三、tcp头 四、udp头...
SpringBoot报错:The field file exceeds its maximum permitted size of 1048576 bytes
报错信息 The field file exceeds its maximum permitted size of 1048576 bytes原因是 SpringBoot内嵌的 tomcat 默认的所有上传的文件大小为 1MB 解决办法 修改配置 spring:servlet:multipart:max-file-size: 50MBmax-request-size: 50MB或者 spring.servlet.multipart.…...
C++的介绍与认识
目录 前言 1.什么是C 2.C的发展历史 3.C参考文档 4.C重要性 4.1C特点 4.2编程语言排行榜 4.3 C的应用领域 5.C学习指南 1. 基础知识 2. 面向对象编程(OOP) 3. 泛型编程 4. 标准库(STL) 结束语 前言 学习了C语言的知识…...
Spark源码详解
https://www.cnblogs.com/huanghanyu/p/12989067.html#_label3_3...
浅尝Apache Mesos
文章目录 1. Mesos是什么2. 共享集群3. Apache Mesos3.1 Mesos主节点3.2 Mesos代理3.3 Mesos框架 4. 资源管理4.1 资源提供4.2 资源角色4.3 资源预留4.4 资源权重与配额 5. 实现框架5.1 框架主类5.3 实现执行器 6. 小结参考 1. Mesos是什么 Mesos是什么,Mesos是一个…...
buuctf题目讲解-1
一眼就解密 ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30 flag{THEFLAGOFTHISSTRING} base家族 base64 加密原理: 明文:abc 去找ascii码的二进制形式 a-->97-→01100001 (二进制为8位如果不足8位则在最左边补0至8位) b-→…...
软件测试学习之-ADB命令
ADB命令 adb工具即Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。在某些特殊的情况下进入不了系统,adb就派上用场啦! Android程序的开发通常需要使用到一…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
