1. 程式人生 > >本地jedis版本過低踩的坑

本地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:7031myself,master- 0 0 1 connected 0-5460

6f7119b06bb3316119f0bed3f793c2ce87983566 119.254.166.136:7036slave

6fd9a873b29f5e9a61756606ececa4a953a11db7 0 1479278388635 6 connected

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

e22f9b0d7cb3fdb932926a1b4d9c3140e70255eb 119.254.166.136:7034slave 2a0ebb6d554fc8aa8a936bc0c0c2a6583425cf7e 0 1479278390639 4 connected

cd480d1b437ad323ae3e15e548db8faf43a5d766 119.254.166.136:7035slave 1b42b9d25779ccd5555fb804d01ddfbdd20635bf 0 1479278385630 5 connected

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

結果就是報NumberFormatException

解決:直接將jedis版本升至最高,目前是jedis-2.9.0,問題解決!

沒有做其他版本的測試,已知jedis-2.7.3是肯定不行的,2.8版本未知,有興趣的朋友可以去測試下.....