package com.bfkj.unidia.cacheUtils;
import com.bfkj.unidia.logUtils.Log;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Duration;
public class CacheUtil {
private static final Logger logger = LoggerFactory.getLogger(CacheUtil.class);
// 缓存配置
private static final int MAX_CACHE_SIZE = 50;
private static final Duration CACHE_EXPIRE_TIME = Duration.ofMinutes(16);
/**
* 构建并配置一个Caffeine缓存实例。
*
*
该方法设置缓存的最大条目数、访问后过期时间,并注册移除监听器以处理缓存项被移除时的清理操作。
* 缓存配置参数来源于静态常量,适用于通用缓存场景。
*
* @param 缓存键的类型
* @param 缓存值的类型
* @return 配置好的Caffeine缓存实例
* @see Caffeine#newBuilder()
* @see #MAX_CACHE_SIZE
* @see #CACHE_EXPIRE_TIME
*/
public static Cache buildCaffeineCache() {
return Caffeine.newBuilder()
.maximumSize(MAX_CACHE_SIZE)
.expireAfterAccess(CACHE_EXPIRE_TIME)
.removalListener((key, value, cause) -> closeAutoCloseable(value, key))
.build();
}
/**
* 关闭指定的AutoCloseable资源并记录操作日志。
*
* @param value 需要关闭的资源对象,若未实现AutoCloseable接口则忽略
* @param key 标识当前缓存资源的键值,用于日志上下文记录
*/
private static void closeAutoCloseable(Object value, Object key) {
if (value instanceof AutoCloseable closeable) {
try {
closeable.close();
Log.info("自动关闭{}缓存: {}", "缓存资源", key);
} catch (Exception e) {
Log.error("关闭{}缓存失败", "缓存资源", e);
}
}
}
}