本地jedis版本过低踩的坑

环境:jedis-2.7.3;redis-4.0.2

客户端使用JedisCluster连接redis集群报错如下:


原因:jedis通过JedisClusterInfoCache.discoverClusterNodesAndSlots方法获取集群节点信息,内部实现

public void discoverClusterNodesAndSlots(Jedis jedis) {
        this.w.lock();

        try {
            this.nodes.clear();
            this.slots.clear();
            String localNodes = jedis.clusterNodes();
            String[] arr$ = localNodes.split("\n");
            int len$ = arr$.length;

            for(int i$ = 0; i$ < len$; ++i$) {
                String nodeInfo = arr$[i$];
                ClusterNodeInformation clusterNodeInfo = nodeInfoParser.parse(nodeInfo, new HostAndPort(jedis.getClient().getHost(), jedis.getClient().getPort()));
                HostAndPort targetNode = clusterNodeInfo.getNode();
                this.setNodeIfNotExist(targetNode);
                this.assignSlotsToNode(clusterNodeInfo.getAvailableSlots(), targetNode);
            }
        } finally {
            this.w.unlock();
        }

    }
关键就是这个jedis.clusterNodes()方法,它会调用cluster nodes指令,而redis4.0以上该指令会将其通信端口一并输出,注意后面的@18006


之前的redis版本作为比较:

2a0ebb6d554fc8aa8a936bc0c0c2a6583425cf7e 119.254.166.136:7031 myself,master - 0 0 1 connected 0-5460

6f7119b06bb3316119f0bed3f793c2ce87983566 119.254.166.136:7036 slave

6fd9a873b29f5e9a61756606ececa4a953a11db7 0 1479278388635 6 connected

1b42b9d25779ccd5555fb804d01ddfbdd20635bf 119.254.166.136:7032 master - 0 1479278389637 2 connected 5461-10922

e22f9b0d7cb3fdb932926a1b4d9c3140e70255eb 119.254.166.136:7034 slave 2a0ebb6d554fc8aa8a936bc0c0c2a6583425cf7e 0 1479278390639 4 connected

cd480d1b437ad323ae3e15e548db8faf43a5d766 119.254.166.136:7035 slave 1b42b9d25779ccd5555fb804d01ddfbdd20635bf 0 1479278385630 5 connected

6fd9a873b29f5e9a61756606ececa4a953a11db7 119.254.166.136:7033 master - 0 1479278386632 3 connected 10923-16383


结果就是报NumberFormatException

解决:直接将jedis版本升至最高,目前是jedis-2.9.0,问题解决!

没有做其他版本的测试,已知jedis-2.7.3是肯定不行的,2.8版本未知,有兴趣的朋友可以去测试下.....