spring-data-redis lettuce cluster scan 問題

如果redis 集羣中某一臺master down ,並且由一臺slave 節點升級爲master ,在使用spring-data-redis 執行scan 的時候還是會繼續去連接down 的節點。導致異常。看了下是lettuce 的問題。因爲原生的lettuce 使用也有問題。解決方案,就是過濾掉down 的節點。

                    Partitions partitions = connection.getPartitions();
                    System.out.println(partitions);
                    RedisAdvancedClusterCommands<String, String> sync = connection.sync();
                   for (RedisClusterNode partition : partitions) {
                        if (partition.isConnected() && partition.is(RedisClusterNode.NodeFlag.MASTER)) {
                             RedisClusterCommands<String, String> syncConnection = sync.getConnection(partition.getNodeId());
                             KeyScanCursor<String> scan = syncConnection.scan(match);
                            Set<String> result = new HashSet<>(scan.getKeys());
                            while (!scan.isFinished()){
                                ScanCursor of = KeyScanCursor.of(scan.getCursor());
                                scan = syncConnection.scan(of,match);
                               result.addAll(scan.getKeys());
                            }
                        System.out.println(partition.getNodeId()+"\t"+ result.size());
                   }
 }

Spring 的解決方法就是

 LettuceConnectionFactory lettuceConnectionFactory=(LettuceConnectionFactory) stringRedisTemplate.getConnectionFactory();
StatefulRedisClusterConnection<String,String> connection = (StatefulRedisClusterConnection<String,String>)lettuceConnectionFactory.getConnection();
  Partitions partitions = connection.getPartitions();
        for (RedisClusterNode partition : partitions) {
			 if (partition.isConnected() && partition.is(RedisClusterNode.NodeFlag.MASTER)){
				  connection.getConnection(partition.getNodeId()).sync().scan(ScanArgs.Builder.limit(100000).match("xxx*"));
				  }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章