From e2d370bd9d3d51c8bb4d702addb466fa5f3f13bf Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期五, 26 十一月 2021 13:42:20 +0800
Subject: [PATCH] update 移除 satoken 自带集成 redis 改为使用 框架自身 Redission 实现 统一方案 性能优异

---
 ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java         |   36 ++++++++
 ruoyi-framework/src/main/java/com/ruoyi/framework/dao/PlusSaTokenDao.java |  178 ++++++++++++++++++++++++++++++++++++++++++++
 pom.xml                                                                   |    6 -
 ruoyi-common/pom.xml                                                      |    5 -
 4 files changed, 213 insertions(+), 12 deletions(-)

diff --git a/pom.xml b/pom.xml
index 55a8c88..f2155ba 100644
--- a/pom.xml
+++ b/pom.xml
@@ -130,12 +130,6 @@
                 <artifactId>sa-token-spring-boot-starter</artifactId>
                 <version>${satoken.version}</version>
             </dependency>
-            <!-- Sa-Token 鏁村悎 Redis 锛堜娇鐢╦ackson搴忓垪鍖栨柟寮忥級 -->
-            <dependency>
-                <groupId>cn.dev33</groupId>
-                <artifactId>sa-token-dao-redis-jackson</artifactId>
-                <version>${satoken.version}</version>
-            </dependency>
             <!-- Sa-Token鏁村悎SpringAOP瀹炵幇娉ㄨВ閴存潈 -->
             <dependency>
                 <groupId>cn.dev33</groupId>
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 2b0f940..5f04400 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -34,11 +34,6 @@
             <groupId>cn.dev33</groupId>
             <artifactId>sa-token-spring-boot-starter</artifactId>
         </dependency>
-        <!-- Sa-Token 鏁村悎 Redis 锛堜娇鐢╦ackson搴忓垪鍖栨柟寮忥級 -->
-        <dependency>
-            <groupId>cn.dev33</groupId>
-            <artifactId>sa-token-dao-redis-jackson</artifactId>
-        </dependency>
         <!-- Sa-Token鏁村悎SpringAOP瀹炵幇娉ㄨВ閴存潈 -->
         <dependency>
             <groupId>cn.dev33</groupId>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java
index 394bdb2..27472a7 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java
@@ -92,6 +92,29 @@
     }
 
     /**
+     * 缂撳瓨鍩烘湰鐨勫璞★紝淇濈暀褰撳墠瀵硅薄 TTL 鏈夋晥鏈�
+     *
+     * @param key   缂撳瓨鐨勯敭鍊�
+     * @param value 缂撳瓨鐨勫��
+     * @param isSaveTtl 鏄惁淇濈暀TTL鏈夋晥鏈�(渚嬪: set涔嬪墠ttl鍓╀綑90 set涔嬪悗杩樻槸涓�90)
+     * @since Redis 6.X 浠ヤ笂浣跨敤 setAndKeepTTL 鍏煎 5.X 鏂规
+     */
+    public static <T> void setCacheObject(final String key, final T value, final boolean isSaveTtl) {
+        RBucket<Object> bucket = client.getBucket(key);
+        if (isSaveTtl) {
+            try {
+                bucket.setAndKeepTTL(value);
+            } catch (Exception e) {
+                long timeToLive = bucket.remainTimeToLive();
+                bucket.set(value);
+                bucket.expire(timeToLive, TimeUnit.MILLISECONDS);
+            }
+        } else {
+            bucket.set(value);
+        }
+    }
+
+    /**
      * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
      *
      * @param key      缂撳瓨鐨勯敭鍊�
@@ -99,7 +122,7 @@
      * @param timeout  鏃堕棿
      * @param timeUnit 鏃堕棿棰楃矑搴�
      */
-    public static <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
+    public static <T> void setCacheObject(final String key, final T value, final long timeout, final TimeUnit timeUnit) {
         RBucket<T> result = client.getBucket(key);
         result.set(value);
         result.expire(timeout, timeUnit);
@@ -141,6 +164,17 @@
     }
 
     /**
+     * 鑾峰緱key鍓╀綑瀛樻椿鏃堕棿
+     *
+     * @param key 缂撳瓨閿��
+     * @return 鍓╀綑瀛樻椿鏃堕棿
+     */
+    public static <T> long getTimeToLive(final String key) {
+        RBucket<T> rBucket = client.getBucket(key);
+        return rBucket.remainTimeToLive();
+    }
+
+    /**
      * 鍒犻櫎鍗曚釜瀵硅薄
      *
      * @param key
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/dao/PlusSaTokenDao.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/dao/PlusSaTokenDao.java
new file mode 100644
index 0000000..6d1c6fb
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/dao/PlusSaTokenDao.java
@@ -0,0 +1,178 @@
+package com.ruoyi.framework.dao;
+
+import cn.dev33.satoken.dao.SaTokenDao;
+import cn.dev33.satoken.util.SaFoxUtil;
+import com.ruoyi.common.utils.RedisUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Sa-Token鎸佷箙灞傛帴鍙�(浣跨敤妗嗘灦鑷甫RedisUtils瀹炵幇 鍗忚缁熶竴)
+ *
+ * @author Lion Li
+ */
+@Component
+public class PlusSaTokenDao implements SaTokenDao {
+
+    /**
+     * 鑾峰彇Value锛屽鏃犺繑绌�
+     */
+    @Override
+    public String get(String key) {
+        return RedisUtils.getCacheObject(key);
+    }
+
+    /**
+     * 鍐欏叆Value锛屽苟璁惧畾瀛樻椿鏃堕棿 (鍗曚綅: 绉�)
+     */
+    @Override
+    public void set(String key, String value, long timeout) {
+        if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE)  {
+            return;
+        }
+        // 鍒ゆ柇鏄惁涓烘案涓嶈繃鏈�
+        if(timeout == SaTokenDao.NEVER_EXPIRE) {
+            RedisUtils.setCacheObject(key, value);
+        } else {
+            RedisUtils.setCacheObject(key, value, timeout, TimeUnit.SECONDS);
+        }
+    }
+
+    /**
+     * 淇慨鏀规寚瀹歬ey-value閿�煎 (杩囨湡鏃堕棿涓嶅彉)
+     */
+    @Override
+    public void update(String key, String value) {
+        long expire = getTimeout(key);
+        // -2 = 鏃犳閿�
+        if(expire == SaTokenDao.NOT_VALUE_EXPIRE) {
+            return;
+        }
+        this.set(key, value, expire);
+    }
+
+    /**
+     * 鍒犻櫎Value
+     */
+    @Override
+    public void delete(String key) {
+        RedisUtils.deleteObject(key);
+    }
+
+    /**
+     * 鑾峰彇Value鐨勫墿浣欏瓨娲绘椂闂� (鍗曚綅: 绉�)
+     */
+    @Override
+    public long getTimeout(String key) {
+        return RedisUtils.getTimeToLive(key);
+    }
+
+    /**
+     * 淇敼Value鐨勫墿浣欏瓨娲绘椂闂� (鍗曚綅: 绉�)
+     */
+    @Override
+    public void updateTimeout(String key, long timeout) {
+        // 鍒ゆ柇鏄惁鎯宠璁剧疆涓烘案涔�
+        if(timeout == SaTokenDao.NEVER_EXPIRE) {
+            long expire = getTimeout(key);
+            if(expire == SaTokenDao.NEVER_EXPIRE) {
+                // 濡傛灉鍏跺凡缁忚璁剧疆涓烘案涔咃紝鍒欎笉浣滀换浣曞鐞�
+            } else {
+                // 濡傛灉灏氭湭琚缃负姘镐箙锛岄偅涔堝啀娆et涓�娆�
+                this.set(key, this.get(key), timeout);
+            }
+            return;
+        }
+        RedisUtils.expire(key, timeout, TimeUnit.SECONDS);
+    }
+
+
+
+    /**
+     * 鑾峰彇Object锛屽鏃犺繑绌�
+     */
+    @Override
+    public Object getObject(String key) {
+        return RedisUtils.getCacheObject(key);
+    }
+
+    /**
+     * 鍐欏叆Object锛屽苟璁惧畾瀛樻椿鏃堕棿 (鍗曚綅: 绉�)
+     */
+    @Override
+    public void setObject(String key, Object object, long timeout) {
+        if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE)  {
+            return;
+        }
+        // 鍒ゆ柇鏄惁涓烘案涓嶈繃鏈�
+        if(timeout == SaTokenDao.NEVER_EXPIRE) {
+            RedisUtils.setCacheObject(key, object);
+        } else {
+            RedisUtils.setCacheObject(key, object, timeout, TimeUnit.SECONDS);
+        }
+    }
+
+    /**
+     * 鏇存柊Object (杩囨湡鏃堕棿涓嶅彉)
+     */
+    @Override
+    public void updateObject(String key, Object object) {
+        long expire = getObjectTimeout(key);
+        // -2 = 鏃犳閿�
+        if(expire == SaTokenDao.NOT_VALUE_EXPIRE) {
+            return;
+        }
+        this.setObject(key, object, expire);
+    }
+
+    /**
+     * 鍒犻櫎Object
+     */
+    @Override
+    public void deleteObject(String key) {
+        RedisUtils.deleteObject(key);
+    }
+
+    /**
+     * 鑾峰彇Object鐨勫墿浣欏瓨娲绘椂闂� (鍗曚綅: 绉�)
+     */
+    @Override
+    public long getObjectTimeout(String key) {
+        return RedisUtils.getTimeToLive(key);
+    }
+
+    /**
+     * 淇敼Object鐨勫墿浣欏瓨娲绘椂闂� (鍗曚綅: 绉�)
+     */
+    @Override
+    public void updateObjectTimeout(String key, long timeout) {
+        // 鍒ゆ柇鏄惁鎯宠璁剧疆涓烘案涔�
+        if(timeout == SaTokenDao.NEVER_EXPIRE) {
+            long expire = getObjectTimeout(key);
+            if(expire == SaTokenDao.NEVER_EXPIRE) {
+                // 濡傛灉鍏跺凡缁忚璁剧疆涓烘案涔咃紝鍒欎笉浣滀换浣曞鐞�
+            } else {
+                // 濡傛灉灏氭湭琚缃负姘镐箙锛岄偅涔堝啀娆et涓�娆�
+                this.setObject(key, this.getObject(key), timeout);
+            }
+            return;
+        }
+        RedisUtils.expire(key, timeout, TimeUnit.SECONDS);
+    }
+
+
+    /**
+     * 鎼滅储鏁版嵁
+     */
+    @Override
+    public List<String> searchData(String prefix, String keyword, int start, int size) {
+        Collection<String> keys = RedisUtils.keys(prefix + "*" + keyword + "*");
+        List<String> list = new ArrayList<>(keys);
+        return SaFoxUtil.searchList(list, start, size);
+    }
+
+}

--
Gitblit v1.9.3