CacheUtil.java 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package com.bfkj.unidia.cacheUtils;
  2. import com.bfkj.unidia.logUtils.Log;
  3. import com.github.benmanes.caffeine.cache.Cache;
  4. import com.github.benmanes.caffeine.cache.Caffeine;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import java.time.Duration;
  8. public class CacheUtil {
  9. private static final Logger logger = LoggerFactory.getLogger(CacheUtil.class);
  10. // 缓存配置
  11. private static final int MAX_CACHE_SIZE = 50;
  12. private static final Duration CACHE_EXPIRE_TIME = Duration.ofMinutes(16);
  13. /**
  14. * 构建并配置一个Caffeine缓存实例。
  15. *
  16. * <p>该方法设置缓存的最大条目数、访问后过期时间,并注册移除监听器以处理缓存项被移除时的清理操作。
  17. * 缓存配置参数来源于静态常量,适用于通用缓存场景。
  18. *
  19. * @param <K> 缓存键的类型
  20. * @param <V> 缓存值的类型
  21. * @return 配置好的Caffeine缓存实例
  22. * @see Caffeine#newBuilder()
  23. * @see #MAX_CACHE_SIZE
  24. * @see #CACHE_EXPIRE_TIME
  25. */
  26. public static <K, V> Cache<K, V> buildCaffeineCache() {
  27. return Caffeine.newBuilder()
  28. .maximumSize(MAX_CACHE_SIZE)
  29. .expireAfterAccess(CACHE_EXPIRE_TIME)
  30. .removalListener((key, value, cause) -> closeAutoCloseable(value, key))
  31. .build();
  32. }
  33. /**
  34. * 关闭指定的AutoCloseable资源并记录操作日志。
  35. *
  36. * @param value 需要关闭的资源对象,若未实现AutoCloseable接口则忽略
  37. * @param key 标识当前缓存资源的键值,用于日志上下文记录
  38. */
  39. private static void closeAutoCloseable(Object value, Object key) {
  40. if (value instanceof AutoCloseable closeable) {
  41. try {
  42. closeable.close();
  43. Log.info("自动关闭{}缓存: {}", "缓存资源", key);
  44. } catch (Exception e) {
  45. Log.error("关闭{}缓存失败", "缓存资源", e);
  46. }
  47. }
  48. }
  49. }