java操作redis集群问题CLUSTERDOWN The cluster is down. Use CLUSTER INFO for more information

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java操作redis集群问题CLUSTERDOWN The cluster is down. Use CLUSTER INFO for more information相关的知识,希望对你有一定的参考价值。

redis.clients.jedis.exceptions.JedisClusterException: CLUSTERDOWN The cluster is down. Use CLUSTER INFO for more information
我查看了redis集群节点都在而且状态正常,但是用java往redis写数据报上面这个异常是为什么,求大神解答

java操作redis集群问题CLUSTERDOWN The cluster is down. Use CLUSTER INFO for more information,配置没有配置好的问题。追问

是什么配置没有配置好,我是新手,请在详细告诉下,多谢

参考技术A redis不支持php的多维数组的存取。
解决办法是:如有要用redis存多维数组,可以把数组json_encode转换成json各式数据,以string类型的方式存储。读取的时候再json_decode回来。这样就可以直接关闭了。

java操作 redis集群

1.redis服务端集群搭建步骤:

  1.下载redis安装包,进行解压安装

  2.安装ruby、rubygems install ruby ,安装ruby的原因是,在进行集群的时候,使用的是ruby语言工具实现的,所以在集群之前首先需要搭建ruby的环境

  3.在上述步骤完成之后,便可以搭建集群环境,redis提供了两种集群搭建方法,执行脚本方法(安装包下面的util包中)和手动搭建。

  注意:

  1.在集群的时候,如果是远端客户端访问redis服务端,那么在分片的时候,需要使用Ip进行分片,下面会详细说

  2.在创建每个节点的时候,不要只用redis-server ,使用绝对路径下的redis-server xxx

  具体的安装步骤如下:http://blog.csdn.net/xu470438000/article/details/42971091

  附件:在安装ruby的时候,需要gemredis,下载地址在下面。

2.客户端(java):

注意:

1.本文的客户端使用的是java,官网中对于java客户端也提供了不少的client,但是本文使用的是官方推荐的jedis。

2.在项目开发中,一般情况下都会用到spring来管理应用,本文也是如此,spring 本身也提供了对redis的集成支持,具体的网址:http://projects.spring.io/spring-data-redis,

 但是好像目前spring-data-redis不提供集群的功能,所以本文没有使用它,而是使用了原装的jedis来进行开发,如果在项目中没有用到集群的功能,则可以使用spirng-data-redis。

 

 

 

下面是具体的代码实现

 

1.maven依赖

 

 

Java代码  技术分享图片
  1. <dependency>  
  2.     <groupId>redis.clients</groupId>  
  3.     <artifactId>jedis</artifactId>  
  4.     <version>2.7.2</version>  
  5. </dependency>  

 

 

2.applicationContext.xml中的配置

 

 

Java代码  技术分享图片
  1.    <!-- jedis cluster config -->  
  2.    <bean name="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig" >  
  3.         <property name="maxWaitMillis" value="-1" />  
  4.         <property name="maxTotal" value="1000" />  
  5.         <property name="minIdle" value="8" />  
  6.         <property name="maxIdle" value="100" />  
  7. </bean>  
  8.   
  9. <bean id="jedisCluster" class="com.besttone.subscribe.util.JedisClusterFactory">  
  10.     <property name="addressConfig">  
  11.         <value>classpath:redis-config.properties</value>  
  12.     </property>  
  13.     <property name="addressKeyPrefix" value="address" />    
  14.       
  15.     <property name="timeout" value="300000" />  
  16.     <property name="maxRedirections" value="6" />  
  17.     <property name="genericObjectPoolConfig" ref="genericObjectPoolConfig" />  
  18. </bean>  

 

 

3.JedisClusterFactory实现类

 

Java代码  技术分享图片
  1. public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean {  
  2.   
  3.     private Resource addressConfig;  
  4.     private String addressKeyPrefix ;  
  5.   
  6.     private JedisCluster jedisCluster;  
  7.     private Integer timeout;  
  8.     private Integer maxRedirections;  
  9.     private GenericObjectPoolConfig genericObjectPoolConfig;  
  10.       
  11.     private Pattern p = Pattern.compile("^.+[:]\d{1,5}\s*$");  
  12.   
  13.     @Override  
  14.     public JedisCluster getObject() throws Exception {  
  15.         return jedisCluster;  
  16.     }  
  17.   
  18.     @Override  
  19.     public Class<? extends JedisCluster> getObjectType() {  
  20.         return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);  
  21.     }  
  22.   
  23.     @Override  
  24.     public boolean isSingleton() {  
  25.         return true;  
  26.     }  
  27.   
  28.   
  29.   
  30.     private Set<HostAndPort> parseHostAndPort() throws Exception {  
  31.         try {  
  32.             Properties prop = new Properties();  
  33.             prop.load(this.addressConfig.getInputStream());  
  34.   
  35.             Set<HostAndPort> haps = new HashSet<HostAndPort>();  
  36.             for (Object key : prop.keySet()) {  
  37.   
  38.                 if (!((String) key).startsWith(addressKeyPrefix)) {  
  39.                     continue;  
  40.                 }  
  41.   
  42.                 String val = (String) prop.get(key);  
  43.   
  44.                 boolean isIpPort = p.matcher(val).matches();  
  45.   
  46.                 if (!isIpPort) {  
  47.                     throw new IllegalArgumentException("ip 或 port 不合法");  
  48.                 }  
  49.                 String[] ipAndPort = val.split(":");  
  50.   
  51.                 HostAndPort hap = new HostAndPort(ipAndPort[0], Integer.parseInt(ipAndPort[1]));  
  52.                 haps.add(hap);  
  53.             }  
  54.   
  55.             return haps;  
  56.         } catch (IllegalArgumentException ex) {  
  57.             throw ex;  
  58.         } catch (Exception ex) {  
  59.             throw new Exception("解析 jedis 配置文件失败", ex);  
  60.         }  
  61.     }  
  62.       
  63.     @Override  
  64.     public void afterPropertiesSet() throws Exception {  
  65.         Set<HostAndPort> haps = this.parseHostAndPort();  
  66.           
  67.         jedisCluster = new JedisCluster(haps, timeout, maxRedirections,genericObjectPoolConfig);  
  68.           
  69.     }  
  70.     public void setAddressConfig(Resource addressConfig) {  
  71.         this.addressConfig = addressConfig;  
  72.     }  
  73.   
  74.     public void setTimeout(int timeout) {  
  75.         this.timeout = timeout;  
  76.     }  
  77.   
  78.     public void setMaxRedirections(int maxRedirections) {  
  79.         this.maxRedirections = maxRedirections;  
  80.     }  
  81.   
  82.     public void setAddressKeyPrefix(String addressKeyPrefix) {  
  83.         this.addressKeyPrefix = addressKeyPrefix;  
  84.     }  
  85.   
  86.     public void setGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {  
  87.         this.genericObjectPoolConfig = genericObjectPoolConfig;  
  88.     }  
  89.   
  90. }  

 

4.redis-config.properties文件

 

   这是一个集群环境,六个节点(不同端口),三个master ,三个slaver

 

Java代码  技术分享图片
  1. address1=192.168.30.139:7000  
  2. address2=192.168.30.139:7001  
  3. address3=192.168.30.139:7002  
  4. address4=192.168.30.139:7003  
  5. address5=192.168.30.139:7004  
  6. address6=192.168.30.139:7005  

 

以上是关于java操作redis集群问题CLUSTERDOWN The cluster is down. Use CLUSTER INFO for more information的主要内容,如果未能解决你的问题,请参考以下文章

Java操作 Redis 集群

java操作redis集群配置[可配置密码]和工具类

java怎么从多台redis集群取数据库

Redis 3.2 Linux 环境集群搭建与java操作

Java操作redis客户端Jedis连接集群(Cluster)

redis3.0 集群实战3 - java编程实战