Guava Cache 是 Google 的 Guava 库提供的一种缓存实现,广泛应用于 Java 项目中,用于在内存中存储和管理数据缓存。它支持自动过期、大小限制、基于时间的过期策略、基于引用的缓存等功能,能有效提高应用程序性能,减少对数据库或远程服务的重复调用。

1. 引入 Guava 依赖

首先,在你的 pom.xml 文件中引入 Guava 的依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version> <!-- 请根据需要使用最新版本 -->
</dependency>

2. Guava Cache 基本用法

Guava 提供了 Cache 接口和一个常用的实现类 CacheBuilder,用来构建缓存。

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import java.util.concurrent.TimeUnit;

public class GuavaCacheExample {

    public static void main(String[] args) {
        // 创建一个缓存,最多可以存储 100 条数据,过期时间为 10 秒
        Cache<String, String> cache = CacheBuilder.newBuilder()
                .maximumSize(100) // 最大缓存数量
                .expireAfterWrite(10, TimeUnit.SECONDS) // 设置缓存项写入后的过期时间
                .build();

        // 存入缓存
        cache.put("key1", "value1");
        cache.put("key2", "value2");

        // 获取缓存
        String value = cache.getIfPresent("key1");
        System.out.println("Cache value for key1: " + value);  // 输出: value1

        // 如果缓存项不存在,可以设置一个默认值或调用计算方法
        String value2 = cache.get("key3", () -> "defaultValue");
        System.out.println("Cache value for key3: " + value2);  // 输出: defaultValue
    }
}

3. 常用配置与功能

a. 最大缓存大小限制

可以限制缓存的最大存储条目,超出最大条目时,Guava 会自动移除最老的缓存项。

Cache<String, String> cache = CacheBuilder.newBuilder()
        .maximumSize(100)  // 最多存储100条数据
        .build();
b. 基于时间的过期策略
  • expireAfterWrite:设置缓存项从写入时起,过期的时间。
  • expireAfterAccess:设置缓存项从最近一次访问时起,过期的时间。
// 缓存项在写入后 10 秒过期
Cache<String, String> cache = CacheBuilder.newBuilder()
        .expireAfterWrite(10, TimeUnit.SECONDS)
        .build();

// 缓存项在 10 秒没有被访问就过期
Cache<String, String> cache = CacheBuilder.newBuilder()
        .expireAfterAccess(10, TimeUnit.SECONDS)
        .build();
c. 基于引用的缓存

通过使用 weakKeys 或 weakValues,Guava 支持使用弱引用来保存键或值。这种方式在内存不足时可以自动回收缓存项。

Cache<String, String> cache = CacheBuilder.newBuilder()
        .weakKeys()  // 使用弱引用作为键
        .weakValues() // 使用弱引用作为值
        .build();
d. 清除缓存

可以使用 cache.invalidate(key) 手动清除指定的缓存项,或使用 cache.invalidateAll() 清除所有缓存项。

cache.invalidate("key1");  // 清除指定的缓存项

cache.invalidateAll();  // 清除所有缓存项
e. 监听缓存的事件

Guava 提供了监听器机制,可以监听缓存项的加载、过期和回收等事件。

Cache<String, String> cache = CacheBuilder.newBuilder()
        .removalListener(notification -> {
            System.out.println("Removed: " + notification.getKey() + " -> " + notification.getValue());
        })
        .build();
        
cache.put("key1", "value1");
cache.invalidate("key1");  // 缓存项移除时会触发回调

4. 使用 CacheLoader 进行懒加载

当缓存项不存在时,可以使用 CacheLoader 来实现懒加载,自动从外部源(如数据库、远程服务等)加载数据。

import com.google.common.cache.CacheLoader;

Cache<String, String> cache = CacheBuilder.newBuilder()
        .maximumSize(100)
        .build(new CacheLoader<String, String>() {
            @Override
            public String load(String key) throws Exception {
                // 如果缓存项不存在,自动加载数据
                return loadFromDatabase(key);
            }
        });

// 使用缓存,如果不存在,自动调用 load 方法加载数据
String value = cache.get("key1");
System.out.println("Cache value for key1: " + value);  // 如果 key1 不在缓存中,会自动调用 loadFromDatabase 方法

5. 通过 CacheStats 获取缓存的统计信息

Guava 提供了 CacheStats 类,用来查看缓存的各种统计数据,例如:命中率、加载失败次数、缓存移除次数等。

import com.google.common.cache.CacheStats;

Cache<String, String> cache = CacheBuilder.newBuilder()
        .maximumSize(100)
        .recordStats()  // 开启统计功能
        .build();

cache.put("key1", "value1");

// 获取缓存统计信息
CacheStats stats = cache.stats();
System.out.println("Cache hit count: " + stats.hitCount());
System.out.println("Cache miss count: " + stats.missCount());

6. 清理与刷新

可以通过 CacheBuilder 配置缓存的清理策略,如当缓存过期或超出容量限制时,如何清理缓存。例如可以使用 expireAfterWrite 来设置缓存过期策略,或者使用 maximumSize 来限制缓存大小。

总结

Guava Cache 是一个强大且易于使用的缓存库,适合用于提高 Java 应用程序的性能。它提供了丰富的配置选项,如大小限制、过期策略、缓存清除、监听机制等,可以帮助开发者根据具体需求实现缓存方案。在处理高频访问的数据时,Guava Cache 是一个非常有效的工具,能够大幅提升应用的响应速度和并发能力。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐