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进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...