From 1b43670626f48266efb898ec7cd7deedcab9ba10 Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期六, 17 八月 2024 15:31:23 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile --- ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java | 122 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 122 insertions(+), 0 deletions(-) diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java new file mode 100644 index 0000000..5c40a14 --- /dev/null +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxCaffineCache.java @@ -0,0 +1,122 @@ +package com.ruoyi.account.wx.tools; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * @author xiaochen + * @ClassName AbstractCaffineCache + * @Description + * @date 2021-01-11 11:27 + */ +@Slf4j +class WxCaffineCache<T> implements WxCacheTemplate<T> { + /** + * 缓存环境 + */ + private String env = "wx"; + + /** + * 本地缓存实例 + */ + private LoadingCache<String, Object> loadingCache; + + /** + * 构造函数 + * + */ + public WxCaffineCache() { + WxCache cache = WxCache.options().setTimeUnit(TimeUnit.SECONDS).build(); + // 构建本地缓存实例 + this.loadingCache = caffineCacheManage(cache); + } + + + @Override + public boolean setKey(String key, T value) { + if (Objects.isNull(this.loadingCache)) { + return Boolean.FALSE; + } + if (StringUtils.hasLength(this.env)) { + this.loadingCache.put(this.env + ":" + key, value); + } else { + this.loadingCache.put(key, value); + } + return Boolean.TRUE; + } + + @Override + public T getKey(String key) { + if (Objects.isNull(this.loadingCache)) { + return null; + } + try { + if (StringUtils.hasLength(this.env)) { + return (T) this.loadingCache.get(this.env + ":" + key); + } else { + return (T) this.loadingCache.get(key); + } + } catch (Exception e) { + return null; + } + } + + @Override + public boolean delKey(String key) { + if (Objects.isNull(this.loadingCache)) { + return Boolean.FALSE; + } + if (StringUtils.hasLength(this.env)) { + this.loadingCache.invalidate(this.env + ":" + key); + } else { + this.loadingCache.invalidate(key); + } + return Boolean.TRUE; + } + + /** + * 缓存管理 + * + * @param cache + * @param <T> + * @return + */ + private static <T> LoadingCache<String, T> caffineCacheManage(WxCache cache) { + log.info("初始化缓存的实体数据:{}", cache); + if (Objects.isNull(cache)) { + throw new NullPointerException("请实例化一个Cache对象!"); + } + LoadingCache<String, T> localcache = + // 构建本地缓存,调用链的方式 + // ,1000是设置缓存的初始化容量,maximumSize是设置缓存最大容量,当超过了最大容量,guava将使用LRU算法(最少使用算法),来移除缓存项 + // expireAfterAccess(12,TimeUnit.HOURS)设置缓存有效期为12个小时 + Caffeine.newBuilder().initialCapacity(cache.getInitialCapacity()).maximumSize(cache.getMaximumSize()) + // 设置写缓存后n秒钟过期 + // .expireAfterWrite(30, TimeUnit.SECONDS) + .expireAfterWrite(cache.getDuration(), cache.getTimeunit()) + // 设置读写缓存后n秒钟过期,实际很少用到,类似于expireAfterWrite + //.expireAfterAccess(googleCache.getDuration(), googleCache.getTimeunit()) + // 只阻塞当前数据加载线程,其他线程返回旧值 + //.refreshAfterWrite(10, TimeUnit.SECONDS) + // 设置缓存的移除通知//用户手动移除EXPLICIT, + // //用户手动替换REPLACED,//被垃圾回收COLLECTED,//超时过期EXPIRED,//SIZE由于缓存大小限制 + .removalListener(new RemovalListener<String, T>() { + @Override + public void onRemoval(String key, Object value, RemovalCause cause) { + log.info(key + ":" + value + ":" + cause.name()); + } + }) + // build里面要实现一个匿名抽象类 + .build(new CacheLoader<String, T>() { + // 这个方法是默认的数据加载实现,get的时候,如果key没有对应的值,就调用这个方法进行加载。此处是没有默认值则返回null + @Override + public T load(String key) throws Exception { + return null; + } + }); + return localcache; + } +} -- Gitblit v1.7.1