Fork me on GitHub

RedisClient升级支持Sentinel使用说明

Published on:
Tags: Redis

项目地址

redis-client

   

RedisClient操作单点Redis使用文档:《RedisClient使用》 以下是支持Sentinel(哨兵)+Redis集群的RedisClient(架构封装的Java访问Redis的客户端程序)高级使用方式

Redis集群方式:Master-Slave(1 - n 为一套集群可以多套) Sentinel集群方式:Sentinel(n台,n>=3),投票人数:n-1(参与Master是否宕机以及下一任Master选举的投票人数)

1. Maven中引用(目前预览版)

<dependency>
  <groupId>cn.tsoft.framework</groupId>
  <artifactId>redis-client</artifactId>
  <version>1.2.0-SNAPSHOT</version>
</dependency>

2. 配置说明

原始(基础)配置:

redis.pool.maxTotal=1000
redis.pool.maxIdle=50
redis.pool.minIdle=10
redis.pool.testOnBorrow=true
redis.pool.testOnReturn=true
redis.ip=192.168.0.65
redis.port=6379
redis.timeout=2000
redis.password=123456

sentinel新增配置

# sentinel
redis.mastername=mymaster
redis.sentinels=127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381

redis.mastername指的是monitor master的名称 redis.sentinels指的是哨兵的ip:port集合(ip和port需要替换)

删除配置

#redis.ip=192.168.0.65
#redis.port=6379

ps.由于使用了sentinel自动发现redis服务因此不需要此配置,注释或删除即可

3. spring配置说明

xml配置跟以前pool的配置方式有所不同,单节点redispool配置使用的是:redis.clients.jedis.JedisPoolConfigredis.clients.jedis.JedisPool sentinel的配置替换为:redis.clients.jedis.JedisPoolConfigcn.tsoft.framework.redis.pool.JedisSentinelPoolFactory

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
     
    <aop:aspectj-autoproxy />
    <context:component-scan base-package="cn.tsoft.framework.redis" />
     
    <bean id="redisClient" class="cn.tsoft.framework.redis.client.impl.RedisClientImpl">
        <property name="jedisSentinelPoolFactory" ref="jedisSentinelPoolFactory" />
    </bean>
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.pool.maxTotal}" />
        <property name="maxIdle" value="${redis.pool.maxIdle}" />
        <property name="minIdle" value="${redis.pool.minIdle}" />
        <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
        <property name="testOnReturn" value="${redis.pool.testOnReturn}" />
    </bean>
     
    <bean id="jedisSentinelPoolFactory" class="cn.tsoft.framework.redis.pool.JedisSentinelPoolFactory">
        <property name="poolConfig" ref="jedisPoolConfig" />
        <property name="masterName" value="${redis.mastername}" />
        <property name="sentinels" value="${redis.sentinels}" />
        <property name="timeout" value="${redis.timeout}" />
        <property name="password" value="${redis.password}" />
    </bean>
</beans>

ps.以上配置在redis-client-1.2.0-SNAPSHOT.jar包的spring-redis-sentinel.xml文件中

4. 项目中引用

<!-- redis.properties加载方式采用UCM的统一配置加载,具体可以查看global中的配置,如需要替换global的配置只需要在项目自定义配置中配置相同的key来进行属性覆盖  -->
<context:component-scan base-package="cn.tsoft.framework.redis" />
<import resource="classpath:spring-redis-sentinel.xml" />

ps.替换掉以前的:<import resource="classpath:spring-redis.xml" />

5. 注意事项

5.1. pool使用只允许使用一种,要么使用jedis pool要么使用jedis sentinel pool,两者不允许共存,redisclient启动会检测pool的设置是否合法,不合法会throw出异常,可能遇见的异常如下:

异常 描述 解决办法
RedisClientException(“There can only be one pool! Will not work.”) 只能存在一个pool的设置 检查xml配置,确定使用的pool,只允许保留一个pool设置,直接引用redis-client.jar中的(spring-redis.xml、spring-redis-sentinel.xml)可以解决这个问题
RedisClientException(“No connection pool found! Will not work.”) 没有找到pool的设置 检查xml配置,是否有pool的设置,直接引用redis-client.jar中的(spring-redis.xml、spring-redis-sentinel.xml)可以解决这个问题

5.2. API使用起来跟以前没有任何变化,只是配置发生了变化

Comments