Files
sa-token/sa-token-dao-redis/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java

209 lines
5.3 KiB
Java
Raw Normal View History

package cn.dev33.satoken.dao;
2020-02-05 00:31:51 +08:00
2021-01-07 22:03:44 +08:00
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
2020-02-05 00:31:51 +08:00
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
2021-01-02 04:00:49 +08:00
import org.springframework.data.redis.connection.RedisConnectionFactory;
2020-02-05 00:31:51 +08:00
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
2020-02-17 23:54:18 +08:00
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
2020-02-05 00:31:51 +08:00
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
2020-02-05 00:31:51 +08:00
2021-01-07 22:03:44 +08:00
import cn.dev33.satoken.util.SaTokenInsideUtil;
2020-02-05 00:31:51 +08:00
/**
* sa-token持久层的实现类, 基于redis
2021-01-30 18:06:14 +08:00
*
* @author kong
*
2020-02-05 00:31:51 +08:00
*/
@Component
2020-02-05 00:31:51 +08:00
public class SaTokenDaoRedis implements SaTokenDao {
/**
2021-02-17 18:07:45 +08:00
* String专用
*/
2020-02-05 00:31:51 +08:00
@Autowired
2021-01-02 04:00:49 +08:00
public StringRedisTemplate stringRedisTemplate;
2020-02-05 00:31:51 +08:00
/**
2021-02-17 18:07:45 +08:00
* Objecy专用
*/
2021-02-17 18:07:45 +08:00
public RedisTemplate<String, Object> objectRedisTemplate;
2020-02-05 00:31:51 +08:00
@Autowired
2021-02-17 18:07:45 +08:00
public void setObjectRedisTemplate(RedisConnectionFactory connectionFactory) {
2021-01-02 04:00:49 +08:00
// 指定相应的序列化方案
StringRedisSerializer keySerializer = new StringRedisSerializer();
JdkSerializationRedisSerializer valueSerializer = new JdkSerializationRedisSerializer();
// 构建RedisTemplate
2021-02-17 18:07:45 +08:00
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
2021-01-02 04:00:49 +08:00
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(keySerializer);
template.setHashKeySerializer(keySerializer);
template.setValueSerializer(valueSerializer);
template.setHashValueSerializer(valueSerializer);
template.afterPropertiesSet();
2021-02-17 18:07:45 +08:00
if(this.objectRedisTemplate == null) {
this.objectRedisTemplate = template;
2021-01-02 04:00:49 +08:00
}
2020-02-05 00:31:51 +08:00
}
/**
2021-01-30 18:06:14 +08:00
* 根据key获取value如果没有则返回空
*/
2020-02-05 00:31:51 +08:00
@Override
2021-02-17 18:07:45 +08:00
public String get(String key) {
2020-02-05 00:31:51 +08:00
return stringRedisTemplate.opsForValue().get(key);
}
/**
* 写入指定key-value键值对并设定过期时间(单位)
*/
2020-02-05 00:31:51 +08:00
@Override
2021-02-17 18:07:45 +08:00
public void set(String key, String value, long timeout) {
// 判断是否为永不过期
if(timeout == SaTokenDao.NEVER_EXPIRE) {
stringRedisTemplate.opsForValue().set(key, value);
} else {
stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
2020-02-05 00:31:51 +08:00
}
/**
2021-02-17 18:07:45 +08:00
* 修改指定key-value键值对 (过期时间不变)
*/
@Override
2021-02-17 18:07:45 +08:00
public void update(String key, String value) {
long expire = getTimeout(key);
2021-01-30 18:06:14 +08:00
// -2 = 无此键
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) {
return;
}
2021-02-17 18:07:45 +08:00
this.set(key, value, expire);
}
/**
2021-01-02 04:00:49 +08:00
* 删除一个指定的key
*/
2020-02-05 00:31:51 +08:00
@Override
2021-02-17 18:07:45 +08:00
public void delete(String key) {
2020-02-05 00:31:51 +08:00
stringRedisTemplate.delete(key);
}
/**
* 根据key获取value如果没有则返回空
*/
@Override
public long getTimeout(String key) {
return stringRedisTemplate.getExpire(key);
}
2021-01-02 04:00:49 +08:00
/**
* 修改指定key的剩余存活时间 (单位: )
*/
@Override
public void updateTimeout(String key, long timeout) {
// 判断是否想要设置为永久
if(timeout == SaTokenDao.NEVER_EXPIRE) {
long expire = getTimeout(key);
if(expire == SaTokenDao.NEVER_EXPIRE) {
// 如果其已经被设置为永久,则不作任何处理
} else {
// 如果尚未被设置为永久那么再次set一次
2021-02-17 18:07:45 +08:00
this.set(key, this.get(key), timeout);
}
return;
}
2021-01-02 04:00:49 +08:00
stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
/**
2021-02-17 18:07:45 +08:00
* 根据key获取Object如果没有则返回空
*/
2020-02-05 00:31:51 +08:00
@Override
2021-02-17 18:07:45 +08:00
public Object getObject(String key) {
return objectRedisTemplate.opsForValue().get(key);
2020-02-05 00:31:51 +08:00
}
/**
2021-02-17 18:07:45 +08:00
* 写入指定键值对并设定过期时间 (单位: )
*/
2020-02-05 00:31:51 +08:00
@Override
2021-02-17 18:07:45 +08:00
public void setObject(String key, Object object, long timeout) {
// 判断是否为永不过期
if(timeout == SaTokenDao.NEVER_EXPIRE) {
2021-02-17 18:07:45 +08:00
objectRedisTemplate.opsForValue().set(key, object);
} else {
2021-02-17 18:07:45 +08:00
objectRedisTemplate.opsForValue().set(key, object, timeout, TimeUnit.SECONDS);
}
2020-02-05 00:31:51 +08:00
}
/**
2021-02-17 18:07:45 +08:00
* 修改指定键值对 (过期时间不变)
*/
2020-02-05 00:31:51 +08:00
@Override
2021-02-17 18:07:45 +08:00
public void updateObject(String key, Object object) {
long expire = getObjectTimeout(key);
2021-01-30 18:06:14 +08:00
// -2 = 无此键
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) {
2020-02-05 00:31:51 +08:00
return;
}
2021-02-17 18:07:45 +08:00
this.setObject(key, object, expire);
2020-02-05 00:31:51 +08:00
}
/**
2021-02-17 18:07:45 +08:00
* 删除一个指定的object
*/
2020-02-05 00:31:51 +08:00
@Override
2021-02-17 18:07:45 +08:00
public void deleteObject(String key) {
objectRedisTemplate.delete(key);
2020-02-05 00:31:51 +08:00
}
/**
2021-02-17 18:07:45 +08:00
* 获取指定key的剩余存活时间 (单位: )
*/
@Override
2021-02-17 18:07:45 +08:00
public long getObjectTimeout(String key) {
return objectRedisTemplate.getExpire(key);
}
2021-01-02 04:00:49 +08:00
/**
2021-02-17 18:07:45 +08:00
* 修改指定key的剩余存活时间 (单位: )
2021-01-02 04:00:49 +08:00
*/
@Override
2021-02-17 18:07:45 +08:00
public void updateObjectTimeout(String key, long timeout) {
// 判断是否想要设置为永久
if(timeout == SaTokenDao.NEVER_EXPIRE) {
2021-02-17 18:07:45 +08:00
long expire = getObjectTimeout(key);
if(expire == SaTokenDao.NEVER_EXPIRE) {
// 如果其已经被设置为永久,则不作任何处理
} else {
// 如果尚未被设置为永久那么再次set一次
2021-02-17 18:07:45 +08:00
this.setObject(key, this.getObject(key), timeout);
}
return;
}
2021-02-17 18:07:45 +08:00
objectRedisTemplate.expire(key, timeout, TimeUnit.SECONDS);
2021-01-02 04:00:49 +08:00
}
2021-01-07 22:03:44 +08:00
/**
* 搜索数据
*/
@Override
public List<String> searchData(String prefix, String keyword, int start, int size) {
Set<String> keys = stringRedisTemplate.keys(prefix + "*" + keyword + "*");
List<String> list = new ArrayList<String>(keys);
return SaTokenInsideUtil.searchList(list, start, size);
}
2021-01-02 04:00:49 +08:00
2020-02-05 00:31:51 +08:00
}