修复jFinal缓存处理类BUG

This commit is contained in:
赵锋 2021-12-20 17:15:38 +08:00
parent 9c852da49b
commit 6363db248a

View File

@ -4,54 +4,73 @@ import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.util.SaFoxUtil;
import com.jfinal.plugin.redis.Cache;
import com.jfinal.plugin.redis.Redis;
import com.jfinal.plugin.redis.serializer.ISerializer;
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* 缓存处理类
*/
public class SaTokenDaoRedis implements SaTokenDao {
private Cache redis = null;
protected Cache redis;
protected ISerializer serializer;
/**
* 标记是否已初始化成功
*/
public boolean isInit;
public SaTokenDaoRedis(String confName){
public SaTokenDaoRedis(String confName) {
redis = Redis.use(confName);
this.isInit = redis != null;
serializer = new SaJdkSerializer();
}
/**
* 获取Value如无返空
*
* @param key
* @return
*/
@Override
public String get(String key) {
return redis.getJedis().get(key);
Jedis jedis = getJedis();
try {
return jedis.get(key);
} finally {
close(jedis);
}
}
/**
* 写入Value并设定存活时间 (单位: )
*
* @param key
* @param value
* @param timeout
*/
@Override
public void set(String key, String value, long timeout) {
if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
if (timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
return;
}
if(timeout == SaTokenDao.NEVER_EXPIRE) {
redis.getJedis().set(key, value);
}else{
redis.getJedis().setex(key,timeout,value);
Jedis jedis = getJedis();
try {
if (timeout == SaTokenDao.NEVER_EXPIRE) {
jedis.set(key, value);
} else {
jedis.setex(key, timeout, value);
}
} finally {
close(jedis);
}
}
/**
* 修改指定key-value键值对 (过期时间不变)
*
* @param key
* @param value
*/
@ -59,42 +78,55 @@ public class SaTokenDaoRedis implements SaTokenDao {
public void update(String key, String value) {
long expire = getTimeout(key);
// -2 = 无此键
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) {
if (expire == SaTokenDao.NOT_VALUE_EXPIRE) {
return;
}
this.set(key,value,expire);
this.set(key, value, expire);
}
/**
* 删除Value
*
* @param key
*/
@Override
public void delete(String key) {
redis.getJedis().del(key);
Jedis jedis = getJedis();
try {
jedis.del(key);
} finally {
close(jedis);
}
}
/**
* 获取Value的剩余存活时间 (单位: )
*
* @param key
* @return
*/
@Override
public long getTimeout(String key) {
return redis.getJedis().ttl(key);
Jedis jedis = getJedis();
try {
return jedis.ttl(key);
} finally {
close(jedis);
}
}
/**
* 修改Value的剩余存活时间 (单位: )
*
* @param key
* @param timeout
*/
@Override
public void updateTimeout(String key, long timeout) {
//判断是否想要设置为永久
if(timeout == SaTokenDao.NEVER_EXPIRE) {
if (timeout == SaTokenDao.NEVER_EXPIRE) {
long expire = getTimeout(key);
if(expire == SaTokenDao.NEVER_EXPIRE) {
if (expire == SaTokenDao.NEVER_EXPIRE) {
// 如果其已经被设置为永久则不作任何处理
} else {
// 如果尚未被设置为永久那么再次set一次
@ -102,39 +134,57 @@ public class SaTokenDaoRedis implements SaTokenDao {
}
return;
}
redis.getJedis().expire(key,timeout);
Jedis jedis = getJedis();
try {
jedis.expire(key, timeout);
} finally {
close(jedis);
}
}
/**
* 获取Object如无返空
*
* @param key
* @return
*/
@Override
public Object getObject(String key) {
return redis.get(key);
Jedis jedis = getJedis();
try {
return valueFromBytes(jedis.get(keyToBytes(key)));
} finally {
close(jedis);
}
}
/**
* 写入Object并设定存活时间 (单位: )
*
* @param key
* @param object
* @param timeout
*/
@Override
public void setObject(String key, Object object, long timeout) {
if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
if (timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
return;
}
if(timeout == SaTokenDao.NEVER_EXPIRE) {
redis.set(key, object);
}else{
redis.setex(key,Integer.parseInt(timeout+""),object);
Jedis jedis = getJedis();
try {
if (timeout == SaTokenDao.NEVER_EXPIRE) {
jedis.set(keyToBytes(key), valueToBytes(object));
} else {
jedis.setex(keyToBytes(key), timeout, valueToBytes(object));
}
} finally {
close(jedis);
}
}
/**
* 更新Object (过期时间不变)
*
* @param key
* @param object
*/
@ -142,7 +192,7 @@ public class SaTokenDaoRedis implements SaTokenDao {
public void updateObject(String key, Object object) {
long expire = getObjectTimeout(key);
// -2 = 无此键
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) {
if (expire == SaTokenDao.NOT_VALUE_EXPIRE) {
return;
}
this.setObject(key, object, expire);
@ -150,41 +200,59 @@ public class SaTokenDaoRedis implements SaTokenDao {
/**
* 删除Object
*
* @param key
*/
@Override
public void deleteObject(String key) {
redis.del(key);
Jedis jedis = getJedis();
try {
jedis.del(keyToBytes(key));
} finally {
close(jedis);
}
}
@Override
public long getObjectTimeout(String key) {
return redis.ttl(key);
Jedis jedis = getJedis();
try {
return jedis.ttl(keyToBytes(key));
} finally {
close(jedis);
}
}
/**
* 修改Object的剩余存活时间 (单位: )
*
* @param key
* @param timeout
*/
@Override
public void updateObjectTimeout(String key, long timeout) {
//判断是否想要设置为永久
if(timeout == SaTokenDao.NEVER_EXPIRE) {
long expire = getTimeout(key);
if(expire == SaTokenDao.NEVER_EXPIRE) {
if (timeout == SaTokenDao.NEVER_EXPIRE) {
long expire = getObjectTimeout(key);
if (expire == SaTokenDao.NEVER_EXPIRE) {
// 如果其已经被设置为永久则不作任何处理
} else {
// 如果尚未被设置为永久那么再次set一次
this.set(key, this.get(key), timeout);
this.setObject(key, this.getObject(key), timeout);
}
return;
}
redis.expire(key,Integer.parseInt(timeout+""));
Jedis jedis = getJedis();
try {
jedis.expire(keyToBytes(key), timeout);
} finally {
close(jedis);
}
}
/**
* 搜索数据
*
* @param prefix
* @param keyword
* @param start
@ -197,4 +265,25 @@ public class SaTokenDaoRedis implements SaTokenDao {
List<String> list = new ArrayList<String>(keys);
return SaFoxUtil.searchList(list, start, size);
}
public Jedis getJedis() {
return redis.getJedis();
}
public void close(Jedis jedis) {
if (jedis != null)
jedis.close();
}
protected byte[] keyToBytes(Object key) {
return key.toString().getBytes();
}
protected byte[] valueToBytes(Object value) {
return serializer.valueToBytes(value);
}
protected Object valueFromBytes(byte[] bytes) {
return serializer.valueFromBytes(bytes);
}
}