添加 sa-token-dao-redisx 插件,用于适配redisx框架(无 spring 依赖)

This commit is contained in:
noear
2022-03-30 22:59:00 +08:00
parent c44ad67117
commit aa252f831c
5 changed files with 267 additions and 0 deletions

View File

@@ -0,0 +1,41 @@
<?xml version='1.0' encoding='utf-8'?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-plugin</artifactId>
<version>1.29.1.trial</version>
</parent>
<packaging>jar</packaging>
<name>sa-token-dao-redisx</name>
<artifactId>sa-token-dao-redisx</artifactId>
<description>sa-token integrate redis</description>
<dependencies>
<!-- sa-token-spring-boot-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-core</artifactId>
<version>${sa-token-version}</version>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>redisx</artifactId>
<version>1.3.4</version>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-test</artifactId>
<version>1.6.34</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,185 @@
package cn.dev33.satoken.dao;
import cn.dev33.satoken.util.SaFoxUtil;
import org.noear.redisx.RedisClient;
import org.noear.redisx.plus.RedisBucket;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
/**
* SaTokenDao 的 redis 适配(相对于之前的 redis 适配;主要去除去 Spring 的依赖)
*
* @author noear
* @since 2022-03-30
*/
public class SaTokenDaoOfRedis implements SaTokenDao {
private final RedisBucket redisBucket;
public SaTokenDaoOfRedis(Properties props) {
this(new RedisClient(props));
}
public SaTokenDaoOfRedis(RedisClient redisClient) {
redisBucket = redisClient.getBucket();
}
/**
* 获取Value如无返空
*/
@Override
public String get(String key) {
return redisBucket.get(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) {
redisBucket.store(key, value, (int) SaTokenDao.NEVER_EXPIRE);
} else {
redisBucket.store(key, value, (int) timeout);
}
}
/**
* 修改指定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) {
redisBucket.remove(key);
}
/**
* 获取Value的剩余存活时间 (单位: 秒)
*/
@Override
public long getTimeout(String key) {
return redisBucket.ttl(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;
}
redisBucket.delay(key, (int) timeout);
}
/**
* 获取Object如无返空
*/
@Override
public Object getObject(String key) {
return redisBucket.getAndDeserialize(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) {
redisBucket.storeAndSerialize(key, object);
} else {
redisBucket.storeAndSerialize(key, object, (int) timeout);
}
}
/**
* 更新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) {
redisBucket.remove(key);
}
/**
* 获取Object的剩余存活时间 (单位: 秒)
*/
@Override
public long getObjectTimeout(String key) {
return redisBucket.ttl(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;
}
redisBucket.delay(key, (int) timeout);
}
/**
* 搜索数据
*/
@Override
public List<String> searchData(String prefix, String keyword, int start, int size) {
Set<String> keys = redisBucket.keys(prefix + "*" + keyword + "*");
List<String> list = new ArrayList<String>(keys);
return SaFoxUtil.searchList(list, start, size);
}
}

View File

@@ -0,0 +1,12 @@
package demo;
import org.noear.solon.Solon;
/**
* @author noear 2022/3/30 created
*/
public class App {
public static void main(String[] args) {
Solon.start(App.class, args);
}
}

View File

@@ -0,0 +1,19 @@
package demo;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.dao.SaTokenDaoOfRedis;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;
/**
* @author noear 2022/3/30 created
*/
@Configuration
public class Config {
@Bean
public void saTokenDaoInit(@Inject("${sa-token-dao.redis}") SaTokenDaoOfRedis saTokenDao) {
//手动操作,可适用于任何框架
SaManager.setSaTokenDao(saTokenDao);
}
}

View File

@@ -0,0 +1,10 @@
sa-token-dao: #名字可以随意取
redis:
server: "localhost:6379"
password: 123456
db: 1
maxTotal: 200