12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 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缓存实例。
- *
- * <p>该方法设置缓存的最大条目数、访问后过期时间,并注册移除监听器以处理缓存项被移除时的清理操作。
- * 缓存配置参数来源于静态常量,适用于通用缓存场景。
- *
- * @param <K> 缓存键的类型
- * @param <V> 缓存值的类型
- * @return 配置好的Caffeine缓存实例
- * @see Caffeine#newBuilder()
- * @see #MAX_CACHE_SIZE
- * @see #CACHE_EXPIRE_TIME
- */
- public static <K, V> Cache<K, V> 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);
- }
- }
- }
- }
|