Jedis如何感知Redis Sentinel中的主节点切换【源码分析】

本文深入分析了JedisSentinelPool的源码,详细介绍了如何通过Sentinel节点集合和主节点名称初始化Redis主节点,以及如何为每个Sentinel创建监听进程,确保在主节点切换时能够及时更新客户端缓冲池。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jedis中Redis Sentinel的客户端JedisSentinelPool的源码分析。
在这里插入图片描述

JedisSentinelPool

代码如下,其中的重点部分为initSentinelsinitPool,其他判断略。

public JedisSentinelPool(String masterName, Set<String> sentinels, GenericObjectPoolConfig poolConfig, int connectionTimeout, int soTimeout, String password, int database, String clientName) {
   
   
    HostAndPort master = this.initSentinels(sentinels, masterName);
    this.initPool(master);
}

initSentinels

initSentinels用sentinels和masterName,也就是Sentinel节点的集合和Redis数据节点的名字来初始化,获取到Redis的主节点,同时呢,为每个Sentinel创建了一个监听的进程。

private HostAndPort initSentinels(Set<String> sentinels, String masterName) {
   
   
    HostAndPort master = null;
    boolean sentinelAvailable = false;
    this.log.info("Trying to find master from available Sentinels...");
    Iterator var5 = sentinels.iterator();

    String sentinel;
    HostAndPort hap;
    // 循环处理Sentinel节点
    while(var5.hasNext()) {
   
   
        sentinel = (String)var5.next();
        hap = HostAndPort.parseString(sentinel);
        this.log.fine("Connecting to Sentinel " + hap);
        Jedis jedis = null;

        try {
   
   
            jedis = new Jedis(hap.getHost(), hap.getPort());
            // 连接上Sentinel节点,根据masterName获取Redis的主节点
            List<String> masterAddr = jedis.sentinelGetMasterAddrByName(masterName);
            // Sentinel集群生效的
            sentinelAvailable = true;
            if (masterAddr != null && masterAddr.size() == 2) {
   
   
                // 将Redis主节点赋值给master变量
                master = this.toHostAndPort(masterAddr);
                this.log.fine("Found Redis master at " + master);
                // 根据Sentinel获取到了Redis的主节点,可以退出Sentinel的集合的循环
                break;
            }

            this
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值