基于配置条件重建已声明的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
相关产品推荐
相关产品推荐

