Google Guava Cache简介

目录

简介

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():使所有键失效,从缓存中清空所有项。

使用示例:

java 复制代码
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 {
        // 创建CacheLoader
        CacheLoader<String, String> loader = new CacheLoader<String, String>() {
            @Override
            public 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 中实现二级缓存,进一步优化系统性能。

相关推荐
飞翔的佩奇几秒前
Java项目: 基于SpringBoot+mybatis+maven医院管理系统(含源码+数据库+任务书+开题报告+毕业论文)
java·数据库·spring boot·毕业设计·maven·mybatis·医院管理系统
java—大象2 分钟前
基于JavaWeb开发的java+Springboot操作系统教学交流平台详细设计实现
java·开发语言·spring boot
nvd118 分钟前
Java ETL - Apache Beam 简介
java·apache·etl
晴子呀25 分钟前
Spring底层原理大致脉络
java·后端·spring
只吹45°风31 分钟前
Java-ArrayList和LinkedList区别
java·arraylist·linkedlist·区别
阿华的代码王国39 分钟前
【JavaEE】多线程编程引入——认识Thread类
java·开发语言·数据结构·mysql·java-ee
黑蛋同志39 分钟前
array和linked list的区别
java
andrew_12191 小时前
腾讯 IEG 游戏前沿技术 一面复盘
java·redis·sql·面试
寻求出路的程序媛1 小时前
JVM —— 类加载器的分类,双亲委派机制
java·jvm·面试
这孩子叫逆1 小时前
35. MyBatis中的缓存失效机制是如何工作的?
java·spring·mybatis