diff --git a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java index e9a4e499..b46e8b6f 100644 --- a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java +++ b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java @@ -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 list = new ArrayList(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); + } }