Reids客户端Jedis的JedisSentinelPool关闭问题

简介:

  JedisSentinelPool使用一组MasterListener线程做主从复制的主服务器选举工作。其父类Pool的close, destory方法用来关闭正真的redis客户端连接池的对象。在JedisSentinelPool对象中重写了destory方法内容是在关闭选举线程之后,调用了父类destory方法;但是没有重写close方法,因而调用close方法不能关闭的掉MasterLinstener线程。Pool的另一个子类JedisPool则没有对close,destory方法做任何变动。

 

 JedisSentinelPool,JedisPool以及Pool之间的关系如下类图:

 wKiom1XDCRGw7J7mAAI3v9YeR9A027.jpg


 查看Pool中close和destory的源码:

 

1
2
3
4
@Override
public  void  close() {
   closeInternalPool();
}
1
2
3
public  void  destroy() {
   closeInternalPool();
}


 close方法实现自java.io.Closeable接口,Closeable是可以关闭的数据源或目标。调用 close 方法可释放对象保存的资源(如打开文件)从这一点看是没有问题的,如果是JDK1.7+的话,那更好了该接口继承了AutoCloseable接口。对于JedisPool而言调用close方法和调用destory效果是一样的,但JedisSentinelPool就不同了,创建JedisSentinelPool是启动了MasterLinstener线程,所以得调用destory方法来完成JedisSentinelPool所持有的资源释放,线程关闭。


 JedisSentinelPool的destory方法:

1
2
3
4
5
6
7
public  void  destroy() {
   for  (MasterListener m : masterListeners) {
     m.shutdown();
   }
 
   super .destroy();
}

  

 结论:如果要关闭的仅仅是Pool(Reids客户端连接池)则调用close,而要关闭主从复制中的主机检测即彻底关闭JedisSentinelPool则要调用destory方法。 


 意外想当然的调用close方法,并没能关闭MasterLinstener线程,并且MasterLinstener线程没有起个好名字,排查是看到的名字叫Thread-xx (xx是数字),这样很不方便排错。!!!所以启动线程起个好名字真的非常必要,这将对排错,诊断,系统监控有莫大的帮助。


本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1682260,如需转载请自行联系原作者

相关文章
|
9月前
|
NoSQL Java Redis
redis: jedis连接超时(需要手动注入连接超时检测的配置)
redis: jedis连接超时(需要手动注入连接超时检测的配置)
286 0
|
9月前
|
缓存 NoSQL 安全
Redis 客户端 Jedis 的那点事
作为分布式缓存系统之一,Redis 应用场景较为广泛,落地于不同的行业领域以及业务场景,因此,在整个架构拓扑中起着重要的作用。
222 1
|
9月前
|
NoSQL Redis 数据库
【2023】Redis服务器与客户端操作
【2023】Redis服务器与客户端操作
154 0
|
NoSQL 安全 Java
redis三个连接客户端框架的选择:Jedis,Redisson,Lettuce
redis三个连接客户端框架的选择:Jedis,Redisson,Lettuce
916 0
|
NoSQL 安全 Java
Jedis 客户端
Jedis 基于 Java 实现,是 shell 程序连接 Redis 数据库最常使用的工具。提供了比较全面的 Redis 命令的支持。
163 0
|
存储 缓存 NoSQL
读写 Redis RESP3 协议以及Redis 6.0客户端缓存
  在四月份的一篇翻译的文章中,我介绍了读写Redis RESP version 2的协议的Go 语言的实现,你可以使用它采用底层的方式读写5.0以及以下版本的Redis。Redis 6.0还在开发之中年底或者明年初就要发布了。Redis 6.0支持多线程I/O,还有客户端缓存。
388 0
|
NoSQL Redis 数据安全/隐私保护
关于redis客户端连接不上
关于redis客户端连接不上
关于redis客户端连接不上
|
NoSQL Java 网络安全
Jedis连接阿里云redis
Jedis连接阿里云redis
323 0
Jedis连接阿里云redis
|
缓存 NoSQL Java
Redis客户端操作之Jedis
在前面的文章给大家详细的介绍了Redis各种知识点,本文主要给大家介绍下java程序怎么操作Redis数据。
Redis客户端操作之Jedis
|
缓存 监控 NoSQL
「最强」Lettuce 已支持 Redis6 客户端缓存
在 **redis 6.0** 版本中,已经默认支持了客户端缓存功能,Java 中主流的连接客户端 **lettuce** 在最新的快照版本 (6.0.0.BUILD-SNAPSHOT) 已经提供支持。 下边就通过代码来体验一下客户端缓存的神奇功能。
403 0