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); } } } }