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