Spring集成redis集群


Spring集成redis集群 有密碼

Maven

<jedis.version>2.9.0</jedis.version>
<spring-data-redis.version>1.7.1.RELEASE</spring-data-redis.version>
<spring.version>3.2.17.RELEASE</spring.version>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>${jedis.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>${spring-data-redis.version}</version>
</dependency>

 

Spring配置文件 

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- <property name="fairness" value="true" /> -->
    <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
    <property name="maxTotal" value="${redis.maxTotal}"/>
    <property name="maxIdle" value="${redis.maxIdle}"/>
    <property name="minIdle" value="${redis.minIdle}"></property>
    <property name="testOnBorrow" value="true"/>
    <property name="testOnReturn" value="true"></property>
</bean>
<bean id="redisClusterConfig"
      class="org.springframework.data.redis.connection.RedisClusterConfiguration">
    <property name="maxRedirects" value="3"></property>
    <property name="clusterNodes">
        <set>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.host1}"></constructor-arg>
                <constructor-arg name="port" value="${redis.port1}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.host2}"></constructor-arg>
                <constructor-arg name="port" value="${redis.port2}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.host3}"></constructor-arg>
                <constructor-arg name="port" value="${redis.port3}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.host4}"></constructor-arg>
                <constructor-arg name="port" value="${redis.port4}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.host5}"></constructor-arg>
                <constructor-arg name="port" value="${redis.port5}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.host6}"></constructor-arg>
                <constructor-arg name="port" value="${redis.port6}"></constructor-arg>
            </bean>
        </set>
    </property>
</bean>
<bean id="jedisConnectionFactory"
      class="com.web.common.redis.JedisConnectionFactory">
    <constructor-arg name="clusterConfig" ref="redisClusterConfig" />
    <property name="timeout" value="${redis.timeout}" />
    <property name="password" value="${cluster.redis.pass}"></property>
    <property name="usePool" value="true"/>
    <property name="poolConfig" ref="jedisPoolConfig"/>
</bean>
<bean id="sessionManager" class="com.web.security.SessionManager">
    <property name="connectionFactory" ref="jedisConnectionFactory"/>
</bean>

 

reids.properties

#redis cluster
cluster.redis.pass=test@123
redis.host1=127.0.0.1
redis.port1=7001
redis.host2=127.0.0.1
redis.port2=7002
redis.host3=127.0.0.1
redis.port3=7003
redis.host4=127.0.0.1
redis.port4=7004
redis.host5=127.0.0.1
redis.port5=7005
redis.host6=127.0.0.1
redis.port6=7006

java相關

public class SessionManager extends StringRedisTemplate {

  public void setTest(String key) { opsForValue().set(key, value); } private String getTest(String key) { String value = opsForValue().get(key); return value; } }

 

有可能會遇到的問題。

1、在redis集群沒有設置密碼之前 以上配置是可以用的。加上密碼之后則出現

Jedis does not support password protected Redis Cluster configurations

查資料發現,  他這里判斷密碼不為空就直接拋出異常。
if (StringUtils.hasText(this.getPassword())) {
    throw new IllegalArgumentException("Jedis does not support password protected Redis Cluster configurations!");
} else {
    return poolConfig != null ? new JedisCluster(hostAndPort, this.timeout, redirects, poolConfig) : new JedisCluster(hostAndPort, this.timeout, redirects, poolConfig);
}

接着查看 JedisCluster構造方法里面竟然有密碼的方法。

public JedisCluster(Set<HostAndPort> jedisClusterNode, int connectionTimeout, int soTimeout, int maxAttempts, String password, GenericObjectPoolConfig poolConfig) {
    super(jedisClusterNode, connectionTimeout, soTimeout, maxAttempts, password, poolConfig);
}

可能是Spring-data-redis版本過低,將Spring-data-redis版本升級到1.8.4就可以解決。

注意:再不想升級版本的情況可以修改Spring-data-redis的源碼。

org.springframework.data.redis.connection.jedis.JedisConnectionFactory

如下:

int redirects = clusterConfig.getMaxRedirects() != null ? clusterConfig.getMaxRedirects() : 5;
if (StringUtils.hasText(this.getPassword())) {
    /*throw new IllegalArgumentException("Jedis does not support password protected Redis Cluster configurations!");*/
    return new JedisCluster(hostAndPort,this.timeout, this.timeout, redirects, this.getPassword(), poolConfig);
} else {
    return poolConfig != null ? new JedisCluster(hostAndPort, this.timeout, redirects, poolConfig) : new JedisCluster(hostAndPort, this.timeout, redirects, poolConfig);
}

這樣就可以完美運行了。

 
2、 升級之后出現Spring版本和Spring-data-redis版本兼容問題
NoSuchMethodError: org.springframework.core.serializer.support.DeserializingConverter.<init>(Ljava/lang/ClassLoader;)V。

將Spring版本升級到4.3.9.RELEASE就可以解決。

 

 

如有不對,請幫忙指出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM