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

使用示例:

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 CacheRedis
存储位置本地内存独立服务器或集群(分布式)
访问速度低延迟,高速内存访问相对较慢,需要网络访问,但仍旧高效
分布式支持不支持支持
持久化不支持支持
数据结构简单的键值对存储丰富的数据结构(字符串、哈希、列表等)
适用场景单机应用、低延迟、本地缓存分布式系统、大数据量、高可用要求
配置和管理简单,轻量级相对复杂,需要配置和管理服务器或集群

总结
Google Guava Cache:适用于单机环境下的缓存需求,尤其是在需要低延迟访问的情况。如果你的应用是单节点,缓存的数据量适中,并且不需要分布式功能,那么 Guava Cache 是一个非常好的选择。
Redis:适用于分布式系统或需要持久化的缓存需求,可处理大规模、高并发的访问。如果你的应用需要在多个节点间共享缓存,大量数据的缓存,或者需要丰富的数据结构功能,Redis 是更好的选择。
在实际应用中,可以根据具体需求选择合适的缓存工具,并且在一些场景中,Guava Cache 和 Redis 可以互相补充。例如,可以在本地使用 Guava Cache 实现一级缓存,在 Redis 中实现二级缓存,进一步优化系统性能。

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值