如果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*"));
}
}