码迷,mamicode.com
首页 > 编程语言 > 详细

Spring集成redis集群

时间:2019-08-11 00:55:13      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:port   prot   text   ram   spring配置   cep   dep   ros   data   

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就可以解决。

 

 

如有不对,请帮忙指出。

Spring集成redis集群

标签:port   prot   text   ram   spring配置   cep   dep   ros   data   

原文地址:https://www.cnblogs.com/zzrs/p/11333313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!