Эх сурвалжийг харах

SaTokenDao 持久化支持 Caffeine本地缓存方式

Gaokun Wang 1 сар өмнө
parent
commit
7520f0c730

+ 8 - 0
eco-bom/pom.xml

@@ -33,6 +33,7 @@
         <jsqlparser.version>5.1</jsqlparser.version>
         <DmJdbcDriver18.version>8.1.3.140</DmJdbcDriver18.version>
         <sa-token.version>1.44.0</sa-token.version>
+        <caffeine.version>3.2.1</caffeine.version>
     </properties>
 
     <!-- 全局的依赖配置-->
@@ -158,6 +159,13 @@
                 <artifactId>sa-token-jwt</artifactId>
                 <version>${sa-token.version}</version>
             </dependency>
+            <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine -->
+            <dependency>
+                <groupId>com.github.ben-manes.caffeine</groupId>
+                <artifactId>caffeine</artifactId>
+                <version>${caffeine.version}</version>
+            </dependency>
+
 
         </dependencies>
     </dependencyManagement>

+ 5 - 0
eco-common/com-security/pom.xml

@@ -23,5 +23,10 @@
             <groupId>cn.dev33</groupId>
             <artifactId>sa-token-jwt</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 71 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/core/dao/SaMapPackageForCaffeine.java

@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.security.core.dao;
+
+
+import cn.dev33.satoken.dao.timedcache.SaMapPackage;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @description SaMapPackageForCaffeine Map 包装类 (Caffeine 版)
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 16:09
+ */
+public class SaMapPackageForCaffeine<V> implements SaMapPackage<V> {
+    public Cache<String, V> cache = Caffeine.newBuilder()
+            .expireAfterWrite(Long.MAX_VALUE, TimeUnit.SECONDS)
+            .maximumSize(Integer.MAX_VALUE)
+            .build();
+
+    @Override
+    public Object getSource() {
+        return cache;
+    }
+
+    /**
+     * 读
+     *
+     * @param key 键
+     * @return 结果
+     */
+    @Override
+    public V get(String key) {
+        return cache.getIfPresent(key);
+    }
+
+    /**
+     * 写
+     *
+     * @param key 键
+     * @param value 值
+     */
+    @Override
+    public void put(String key, V value) {
+        cache.put(key, value);
+    }
+
+    /**
+     * 删
+     * @param key 键
+     */
+    @Override
+    public void remove(String key) {
+        cache.invalidate(key);
+    }
+
+    /**
+     * 所有 key
+     */
+    @Override
+    public Set<String> keySet() {
+        return cache.asMap().keySet();
+    }
+}

+ 92 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/core/dao/SaTokenDaoForCaffeine.java

@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.security.core.dao;
+
+
+import cn.dev33.satoken.dao.SaTokenDao;
+import cn.dev33.satoken.dao.auto.SaTokenDaoByStringFollowObject;
+import cn.dev33.satoken.dao.timedcache.SaTimedCache;
+import cn.dev33.satoken.util.SaFoxUtil;
+
+import java.util.List;
+
+/**
+ * @description SaTokenDaoForCaffeine Sa-Token 持久层实现,基于 SaTimedCache - Caffeine (内存缓存,系统重启后数据丢失)
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 16:08
+ */
+public class SaTokenDaoForCaffeine implements SaTokenDaoByStringFollowObject, SaTokenDao {
+    public SaTimedCache timedCache = new SaTimedCache(
+            new SaMapPackageForCaffeine<>(),
+            new SaMapPackageForCaffeine<>()
+    );
+
+    // ------------------------ Object 读写操作
+
+    @Override
+    public Object getObject(String key) {
+        return timedCache.getObject(key);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T getObject(String key, Class<T> classType) {
+        return (T) getObject(key);
+    }
+
+    @Override
+    public void setObject(String key, Object object, long timeout) {
+        timedCache.setObject(key, object, timeout);
+    }
+
+    @Override
+    public void updateObject(String key, Object object) {
+        timedCache.updateObject(key, object);
+    }
+
+    @Override
+    public void deleteObject(String key) {
+        timedCache.deleteObject(key);
+    }
+
+    @Override
+    public long getObjectTimeout(String key) {
+        return timedCache.getObjectTimeout(key);
+    }
+
+    @Override
+    public void updateObjectTimeout(String key, long timeout) {
+        timedCache.updateObjectTimeout(key, timeout);
+    }
+
+
+    // --------- 会话管理
+
+    @Override
+    public List<String> searchData(String prefix, String keyword, int start, int size, boolean sortType) {
+        return SaFoxUtil.searchList(timedCache.keySet(), prefix, keyword, start, size, sortType);
+    }
+
+
+    // --------- 组件生命周期
+
+    /**
+     * 组件被安装时,开始刷新数据线程
+     */
+    @Override
+    public void init() {
+        timedCache.initRefreshThread();
+    }
+
+    /**
+     * 组件被卸载时,结束定时任务,不再定时清理过期数据
+     */
+    @Override
+    public void destroy() {
+        timedCache.endRefreshThread();
+    }
+}