Redis.use().方法和Redis.use().getJedis().方法

@JFinal

项目中需要用到Redis,用的RedisPlugin启动了好几个连接分别实现不同的功能。

这里有个疑问:

第一种用法:

jedis = Redis.use(adapter.getRedisConfigName()).getJedis();

Object o = jedis.rpop(adapter.getQueueKeyName());

这种用法结束后,需要调用

jedis.close();

嘛?如果不调用会有什么隐患?

第二种用法:

Object o = Redis.use(adapter.getRedisConfigName()).lpop(adapter.getQueueKeyName());

这种直接调封装的方法,用完需要调用关闭嘛?如果不调用会有什么隐患?

感谢!

评论区

JFinal

2020-09-28 21:03

需要调用,否则会存在资源泄漏,具体来说就是 redis 连接未关闭,另一个线程下次使用的时候可能会无法获取到连接

对于这种情况,你可以封装一个工具类,在里头用 try finally 关闭资源

zzutligang

2020-09-29 09:08

@JFinal,确实,我是在线程里run里不停的操作访问redis,如果不关闭,一会儿线程就卡死了。每次操作完,close掉,线程就不卡死了。我看JFinal里Redis的源码,也就是第二种用法,每次操作完,在finall里都关闭了。
另外,我想追问下,上次问了关于序列化的问题。如果全部用Redis封装好的方法而不是调用Redis.use(adapter.getRedisConfigName()).getJedis();后拿到Jedis操作,JFinal默认使用fst序列化库。能不能不用这个序列化库,就用原始的方法读写redis库?因为如果用封装的方法,会使用fst序列化库,但lua脚本里又使用原始的读写方法,这样两边序列化不一致,会报错。

彭大勃

2020-09-29 09:25

@zzutligang 你可以在configPlugin里面使用setSerializer方法,去修改jfinal的默认的序列化方式,你应该还可以针对string类型和json类型分别设置不同的序列化方式.你将你所有读取和存储的地方,统一成一样的序列化方式就可以啦

zzutligang

2020-09-29 10:50

@彭大勃 谢谢你的回复。我再看看源码里那个序列化接口,从那个接口实现一个序列化对象,传进去应该就可以了。

热门反馈

扫码入社