文档章节

Redis之JedisConnectionFactory通过哨兵发现master

克虏伯
 克虏伯
发布于 09/16 17:55
字数 550
阅读 13
收藏 1

    JedisConnectionFactory中配置了哨兵后,会自动发现master节点,它是怎么做到的呢?

    注:Spring-data-redis的版本: 1.8.7.RELEASE,Jedis的版本: 2.9.0.RELEASE

1.xml配置

    List-1 properties文件省略了

<bean class="redis.clients.jedis.JedisPoolConfig" id="jedisPoolConfig">
    <property name="maxTotal" value="${redis.maxTotal}"/>
    <property name="maxIdle" value="${redis.maxIdle}"/>
    <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"/>
    <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"/>
    <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"/>
    <property name="softMinEvictableIdleTimeMillis"
              value="${redis.softMinEvictableIdleTimeMillis}"/>
    <property name="testOnReturn" value="${redis.testOnReturn}"/>
    <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
    <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
</bean>
<!-- redis集群配置 哨兵模式 -->
<bean class="org.springframework.data.redis.connection.RedisSentinelConfiguration" id="sentinelConfiguration">
    <property name="master">
        <bean class="org.springframework.data.redis.connection.RedisNode">
            <property name="name" value="${redis.master}"/>
        </bean>
    </property>
    <property name="sentinels">
        <set>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.sentinel.host1}"/>
                <constructor-arg name="port" value="${redis.sentinel.port1}"/>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.sentinel.host2}"/>
                <constructor-arg name="port" value="${redis.sentinel.port2}"/>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.sentinel.host3}"/>
                <constructor-arg name="port" value="${redis.sentinel.port3}"/>
            </bean>
        </set>
    </property>
</bean>
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"/>
    <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
    <property name="database" value="${redis.dbIndex}"/>
</bean>

    这样我们就在JedisConnectionFactory中配置了pool和哨兵信息。

2.分析JedisConnectionFactory

    看如下图1所示:

                         

                                                           图1 JedisConnectionFactory的继承图

    如果了解过SpringIOC的,那么看到InitializingBean,应该知道JedisConnectionFactory为什么继承它了。看如下图2所示

                    

                                                     图2 JedisConnectionFactory的afterPropertiesSet时序图

        重点在步骤12中,MasterListener继承了Thread,它是个单独的线程,通过Jedis监听Redis的哨兵,如果收到master改变的消息,那么会修改JedisFactory。如下图3所示是MasterListener收到master节点变化的消息: 

       

     

                                                    图3 MasterListener收到master改变的消息

    图3中,message的内容表示,之前6482端口的redis是master,现在6483端口的才是master。

    收到master改变的消息后,会修改JedisFactory,进而会影响connection的获取。值得注意的是,连接池底层上使用的是apache的common-pool的org.apache.commons.pool2.impl.GenericObjectPool,有兴趣的读者可以去看下common-pool的实现,我在这里就不再深入common-pool的实现。提示: dbcp连接池使用的也是common-pool,如果你理解了common-pool的实现,那么会明白连接池的很多参数是什么意思(比如maxActive、maxIdle等)。

 

© 著作权归作者所有

共有 人打赏支持
克虏伯

克虏伯

粉丝 13
博文 271
码字总数 92002
作品 0
渝北
程序员
redis主从配置sentinel模式springboot访问

redis主从配置 # master配置 redis.conf 默认无需修改 sentinel.conf sentinel monitor # salve配置 redis.conf sentinel.conf # redis启动 # springboot访问配置 参考:redis哨兵模式问题 ...

longsys
2016/02/29
247
0
Redis哨兵模式及配置详解

前言 在上一篇redis的主从复制中已经实现了redis的主从架构,但是如果redis的主从架构中出现宕机怎么办?如果从redis宕机相对简单一些,那么如果住redis的宕机就会比较麻烦,需要我们手动进行...

刘大磊的博客
2017/12/19
0
0
Docker下redis与springboot三部曲之三:springboot下访问redis哨兵

在《 Docker下redis与springboot三部曲之二:安装redis主从和哨兵》一文中,我们在docker下搭建了redis主从和哨兵,本章我们开发一个基于springboot的web工程,体验springboot下如何使用red...

boling_cavalry
01/13
0
0
Redis-哨兵机制,实现高可用

概述 Redis哨兵为Redis提供了高可用性。实际上这意味着你可以使用哨兵模式创建一个可以不用人为干预而应对各种故障的Redis部署。 哨兵模式还提供了其他的附加功能,如监控,通知,为客户端提...

XiaoBingZ
2017/12/11
0
0
Redis的哨兵(sentinel)(概念)

Redis的哨兵(sentinel) redis的sentinel系统用于管理多个redis服务器实例(instance)。 哨兵适用于非集群结构的redis环境,比如:redis主从环境。 在redis集群中,节点担当了哨兵的功能,...

张德帅ya
05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

web打印控件 LODOP的详细api

web打印控件 LODOP的详细api

wangxujun59
28分钟前
1
0
从一次小哥哥与小姐姐的转账开始, 浅谈分布式事务从理论到实践

分布式事务是个业界难题,在看分布式事务方案之前,先从单机数据库事务开始看起。 什么是事务 事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失...

中间件小哥
31分钟前
5
0
荣登Github日榜!微信最新开源MMKV

MMKV 开源当日即登Github Trending日榜,三日后荣登周榜。MMKV 在腾讯内部开源半年,得到公司内部团队的广泛应用和一致好评。 MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序...

腾讯开源
40分钟前
2
0
前端取色工具:jcpicker

http://annystudio.com/software/colorpicker/#jcp-download

轻量级赤影
42分钟前
1
0
Swift - 将图片保存到相册

import Photos func loadImage(image:UIImage) { UIImageWriteToSavedPhotosAlbum(image, self, #selector(saveImage(image:didFinishSavingWithError:contextInfo:)), ni......

west_zll
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部