Spring整合Redis哨兵模式(Sentinel)

前提

准备Jar包依赖,注意版本不要随意更换,经测试,有的版本会报错

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.8.6.RELEASE</version>
        </dependency>
        <!-- redis 依赖 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

配置文件

redis.properties

#最大空闲数(默认:8)
redis.maxIdle=300
#当连接池资源耗尽时,调用者最大阻塞时间,超时将抛出异常.单位:毫秒,默认:-1,表示永不超时.
redis.maxWait=1000
#最大连接数(默认:8)
redis.maxTotal=500
#指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 (默认:false)
redis.testOnBorrow=true
redis.testOnReturn=true
redis.testWhileIdle=true
redis.blockWhenExhausted=false
redis.numTestsPerEvictionRun=1024
redis.timeBetweenEvictionRunsMillis=30000
redis.minEvictableIdleTimeMillis=1800000
redis.maxActive = 1024
redis.timeOut = 10000
#Sentinel
redis.sentinel.master = mymaster #这里是配置Redis哨兵sentinel.conf中的名字!一定要一样!
redis.sentinel.auth = 123456789  #同样是sentinel.conf中配置的密码,如果没设置可以不写
#Redis哨兵配置的所有服务器和端口号(sentinel.conf中的端口号,不是redis.conf中的!)
redis.sentinel.addr_1 = 192.168.100.1
redis.sentinel.port_1 = 26379
redis.sentinel.addr_2 = 192.168.100.2
redis.sentinel.port_2 = 26379
redis.sentinel.addr_3 = 192.168.100.3
redis.sentinel.port_3 = 26379

redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    <!--扫描redis配置文件-->
    <context:property-placeholder location="classpath:redis.properties"/>

    <!--设置连接池-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大空闲连接数 -->
        <property name="maxIdle" value="{redis.maxIdle}"/>
        <!-- 最大连接数 -->
        <property name="maxTotal" value="{redis.maxTotal}"/>
        <!-- 每次释放连接的最大数目 -->
        <property name="numTestsPerEvictionRun" value="{redis.numTestsPerEvictionRun}"/>
        <!-- 释放连接的扫描间隔(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="{redis.timeBetweenEvictionRunsMillis}"/>
        <!-- 连接最小空闲时间 -->
        <property name="minEvictableIdleTimeMillis" value="{redis.minEvictableIdleTimeMillis}"/>
        <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
        <property name="maxWaitMillis" value="{redis.maxWait}"/>
        <!-- 在获取连接的时候检查有效性, 默认false -->
        <property name="testOnBorrow" value="{redis.testOnBorrow}"/>
        <property name="testOnReturn" value="{redis.testOnReturn}"/>
        <!-- 在空闲时检查有效性, 默认false -->
        <property name="testWhileIdle" value="{redis.testWhileIdle}"/>
        <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
        <property name="blockWhenExhausted" value="{redis.blockWhenExhausted}"/>
    </bean>
    <!-- Sentinel模式 -->
    <bean id="sentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
        <property name="master">
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <!--这个值要和Sentinel中指定的master的值一致,不然启动时找不到Sentinel会报错的-->
                <property name="name" value="{redis.sentinel.master}"/>
            </bean>
        </property>
        <!-- 指定Sentinel的IP和端口 -->
        <property name="sentinels">
            <set>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="{redis.sentinel.addr_1}"/>
                    <constructor-arg name="port" value="{redis.sentinel.port_1}"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="{redis.sentinel.addr_2}"/>
                    <constructor-arg name="port" value="{redis.sentinel.port_2}"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="{redis.sentinel.addr_3}"/>
                    <constructor-arg name="port" value="{redis.sentinel.port_3}"/>
                </bean>
            </set>
        </property>
    </bean>
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"/>
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
        <!-- 如果没有设置密码,下面这行可以注释掉 -->
        <property name="password" value="{redis.sentinel.auth}"/>
    </bean>
    <bean id="redisTemplate"
          class="org.springframework.data.redis.core.StringRedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
    </bean>
</beans>

Spring上下文配置文件

在SpringContext的上下文配置文件中导入以上两个配置文件,一般这个上下文配置文件名字都是类似:applicationContext.xml、springContext.xml等等等…这里就不放全部的内容,每个人的项目可能都不太一样,只放需要配置的

导入redis.properties

这个一般放在配置文件的较上面位置

    <!-- 引入配置文件 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <!-- 系统配置参数 -->
        <property name="locations">
            <list>
                <!-- redis配置参数 -->
                <value>classpath:redis.properties</value>
            </list>
        </property>
    </bean>

导入redis.xml

这个一般放在配置文件的最下面

    <!-- 引入redis配置 -->
    <import resource="classpath:redis.xml"/>

之后启动项目验证就行了,至于JedisConnectionFactory是怎么实现通过Sentinel帮我们发现并且切换master主节点的,博主有时间再研究一下

发表评论

邮箱地址不会被公开。 必填项已用*标注