From e2d370bd9d3d51c8bb4d702addb466fa5f3f13bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Fri, 26 Nov 2021 13:42:20 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E7=A7=BB=E9=99=A4=20satoken=20?= =?UTF-8?q?=E8=87=AA=E5=B8=A6=E9=9B=86=E6=88=90=20redis=20=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E4=BD=BF=E7=94=A8=20=E6=A1=86=E6=9E=B6=E8=87=AA?= =?UTF-8?q?=E8=BA=AB=20Redission=20=E5=AE=9E=E7=8E=B0=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=96=B9=E6=A1=88=20=E6=80=A7=E8=83=BD=E4=BC=98=E5=BC=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 - ruoyi-common/pom.xml | 5 - .../com/ruoyi/common/utils/RedisUtils.java | 36 +++- .../ruoyi/framework/dao/PlusSaTokenDao.java | 178 ++++++++++++++++++ 4 files changed, 213 insertions(+), 12 deletions(-) create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/dao/PlusSaTokenDao.java diff --git a/pom.xml b/pom.xml index 55a8c8826..f2155badb 100644 --- a/pom.xml +++ b/pom.xml @@ -130,12 +130,6 @@ sa-token-spring-boot-starter ${satoken.version} - - - cn.dev33 - sa-token-dao-redis-jackson - ${satoken.version} - cn.dev33 diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 2b0f9406c..5f04400f3 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -34,11 +34,6 @@ cn.dev33 sa-token-spring-boot-starter - - - cn.dev33 - sa-token-dao-redis-jackson - cn.dev33 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 394bdb298..27472a72a 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 @@ -91,6 +91,29 @@ public class RedisUtils { client.getBucket(key).set(value); } + /** + * 缓存基本的对象,保留当前对象 TTL 有效期 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param isSaveTtl 是否保留TTL有效期(例如: set之前ttl剩余90 set之后还是为90) + * @since Redis 6.X 以上使用 setAndKeepTTL 兼容 5.X 方案 + */ + public static void setCacheObject(final String key, final T value, final boolean isSaveTtl) { + RBucket 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、String、实体类等 * @@ -99,7 +122,7 @@ public class RedisUtils { * @param timeout 时间 * @param timeUnit 时间颗粒度 */ - public static void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { + public static void setCacheObject(final String key, final T value, final long timeout, final TimeUnit timeUnit) { RBucket result = client.getBucket(key); result.set(value); result.expire(timeout, timeUnit); @@ -140,6 +163,17 @@ public class RedisUtils { return rBucket.get(); } + /** + * 获得key剩余存活时间 + * + * @param key 缓存键值 + * @return 剩余存活时间 + */ + public static long getTimeToLive(final String key) { + RBucket rBucket = client.getBucket(key); + return rBucket.remainTimeToLive(); + } + /** * 删除单个对象 * 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 000000000..6d1c6fbe8 --- /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); + } + } + + /** + * 修修改指定key-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 { + // 如果尚未被设置为永久,那么再次set一次 + 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 { + // 如果尚未被设置为永久,那么再次set一次 + this.setObject(key, this.getObject(key), timeout); + } + return; + } + RedisUtils.expire(key, timeout, TimeUnit.SECONDS); + } + + + /** + * 搜索数据 + */ + @Override + public List searchData(String prefix, String keyword, int start, int size) { + Collection keys = RedisUtils.keys(prefix + "*" + keyword + "*"); + List list = new ArrayList<>(keys); + return SaFoxUtil.searchList(list, start, size); + } + +}