You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于配置条件重建已声明的Guava Cache及获取最后访问时间的问询

解决方案

一、根据用户配置重建缓存

原代码中CACHE被声明为static final,无法直接替换实例,需要调整缓存的引用方式,使其支持动态重建:

基础实现

先将缓存声明改为可变静态变量,再提供初始化/重建方法:

private static Cache<String, List<String>> CACHE;

// 初始化缓存的方法,可接收用户配置的过期时间
private static void initCache(long expireMinutes) {
    CACHE = CacheBuilder.newBuilder()
            .expireAfterWrite(expireMinutes, TimeUnit.MINUTES)
            .build();
}

// 程序启动时执行默认初始化(或读取用户配置值)
static {
    initCache(30);
}

保留原数据的重建方式

如果需要保留原缓存中的数据,重建时可以先复制条目到新缓存:

private static void rebuildCache(long newExpireMinutes) {
    Cache<String, List<String>> newCache = CacheBuilder.newBuilder()
            .expireAfterWrite(newExpireMinutes, TimeUnit.MINUTES)
            .build();
    // 复制原缓存的所有条目
    for (Map.Entry<String, List<String>> entry : CACHE.asMap().entrySet()) {
        newCache.put(entry.getKey(), entry.getValue());
    }
    // 替换缓存引用
    CACHE = newCache;
}

二、获取缓存条目的最后访问时间

Guava原生Cache没有直接提供单条目访问时间的API,可通过以下两种方式实现:

方式1:自定义值包装类(支持单条目访问时间)

把缓存值包装成包含数据和访问时间的对象,每次获取数据时更新时间:

// 包装类,存储业务数据与最后访问时间
static class CacheValue<T> {
    private T data;
    private long lastAccessTime;

    public CacheValue(T data) {
        this.data = data;
        this.lastAccessTime = System.currentTimeMillis();
    }

    public T getData() {
        // 每次获取数据时更新访问时间
        this.lastAccessTime = System.currentTimeMillis();
        return data;
    }

    public long getLastAccessTime() {
        return lastAccessTime;
    }
}

// 使用LoadingCache加载数据
private static LoadingCache<String, CacheValue<List<String>>> CACHE;

static {
    CACHE = CacheBuilder.newBuilder()
            .expireAfterWrite(30, TimeUnit.MINUTES)
            .build(new CacheLoader<String, CacheValue<List<String>>>() {
                @Override
                public CacheValue<List<String>> load(String key) throws Exception {
                    // 这里替换为你的数据加载逻辑(如数据库查询)
                    List<String> data = fetchData(key);
                    return new CacheValue<>(data);
                }
            });
}

// 获取业务数据(自动更新访问时间)
public static List<String> getCacheValue(String key) throws ExecutionException {
    return CACHE.get(key).getData();
}

// 获取指定条目的最后访问时间
public static long getLastAccessTime(String key) {
    CacheValue<List<String>> value = CACHE.getIfPresent(key);
    return value != null ? value.getLastAccessTime() : -1;
}

方式2:启用缓存统计(仅支持整体访问统计)

如果只需要整体缓存的访问统计(如命中次数、平均加载时间),可以启用recordStats():

private static Cache<String, List<String>> CACHE = CacheBuilder.newBuilder()
        .expireAfterWrite(30, TimeUnit.MINUTES)
        .recordStats()
        .build();

// 获取整体统计信息
public static void showCacheStats() {
    CacheStats stats = CACHE.stats();
    System.out.println("缓存命中次数:" + stats.hitCount());
    System.out.println("平均加载耗时:" + stats.averageLoadPenalty() + "纳秒");
    // 更多统计项可查看CacheStats类的API
}

内容的提问来源于stack exchange,提问作者jijesh vu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:47:14