/** * Get all master nodes in cluster. * * @return never {@literal null}. */ public Set<RedisClusterNode> getMasterNodes() { Set<RedisClusterNode> masterNodes = new LinkedHashSet<>(nodes.size()); for (RedisClusterNode node : nodes) { if (node.isMaster()) { masterNodes.add(node); } } return masterNodes; }
@Override public Map<RedisClusterNode, Collection<RedisClusterNode>> clusterGetMasterSlaveMap() { Iterable<RedisClusterNode> res = clusterGetNodes(); Set<RedisClusterNode> masters = new HashSet<RedisClusterNode>(); for (Iterator<RedisClusterNode> iterator = res.iterator(); iterator.hasNext();) { RedisClusterNode redisClusterNode = iterator.next(); if (redisClusterNode.isMaster()) { masters.add(redisClusterNode); } } Map<RedisClusterNode, Collection<RedisClusterNode>> result = new HashMap<RedisClusterNode, Collection<RedisClusterNode>>(); for (Iterator<RedisClusterNode> iterator = res.iterator(); iterator.hasNext();) { RedisClusterNode redisClusterNode = iterator.next(); for (RedisClusterNode masterNode : masters) { if (redisClusterNode.getMasterId() != null && redisClusterNode.getMasterId().equals(masterNode.getId())) { Collection<RedisClusterNode> list = result.get(masterNode); if (list == null) { list = new ArrayList<RedisClusterNode>(); result.put(masterNode, list); } list.add(redisClusterNode); } } } return result; }
@Override public Map<RedisClusterNode, Collection<RedisClusterNode>> clusterGetMasterSlaveMap() { Iterable<RedisClusterNode> res = clusterGetNodes(); Set<RedisClusterNode> masters = new HashSet<RedisClusterNode>(); for (Iterator<RedisClusterNode> iterator = res.iterator(); iterator.hasNext();) { RedisClusterNode redisClusterNode = iterator.next(); if (redisClusterNode.isMaster()) { masters.add(redisClusterNode); } } Map<RedisClusterNode, Collection<RedisClusterNode>> result = new HashMap<RedisClusterNode, Collection<RedisClusterNode>>(); for (Iterator<RedisClusterNode> iterator = res.iterator(); iterator.hasNext();) { RedisClusterNode redisClusterNode = iterator.next(); for (RedisClusterNode masterNode : masters) { if (redisClusterNode.getMasterId() != null && redisClusterNode.getMasterId().equals(masterNode.getId())) { Collection<RedisClusterNode> list = result.get(masterNode); if (list == null) { list = new ArrayList<RedisClusterNode>(); result.put(masterNode, list); } list.add(redisClusterNode); } } } return result; }
@Override public Map<RedisClusterNode, Collection<RedisClusterNode>> clusterGetMasterSlaveMap() { Iterable<RedisClusterNode> res = clusterGetNodes(); Set<RedisClusterNode> masters = new HashSet<RedisClusterNode>(); for (Iterator<RedisClusterNode> iterator = res.iterator(); iterator.hasNext();) { RedisClusterNode redisClusterNode = iterator.next(); if (redisClusterNode.isMaster()) { masters.add(redisClusterNode); } } Map<RedisClusterNode, Collection<RedisClusterNode>> result = new HashMap<RedisClusterNode, Collection<RedisClusterNode>>(); for (Iterator<RedisClusterNode> iterator = res.iterator(); iterator.hasNext();) { RedisClusterNode redisClusterNode = iterator.next(); for (RedisClusterNode masterNode : masters) { if (redisClusterNode.getMasterId() != null && redisClusterNode.getMasterId().equals(masterNode.getId())) { Collection<RedisClusterNode> list = result.get(masterNode); if (list == null) { list = new ArrayList<RedisClusterNode>(); result.put(masterNode, list); } list.add(redisClusterNode); } } } return result; }
/** * Get all master nodes in cluster where {@code link-state} is {@literal connected} and {@code flags} does not contain * {@literal fail} or {@literal fail?}. * * @return never {@literal null}. */ public Set<RedisClusterNode> getActiveMasterNodes() { Set<RedisClusterNode> activeMasterNodes = new LinkedHashSet<>(nodes.size()); for (RedisClusterNode node : nodes) { if (node.isMaster() && node.isConnected() && !node.isMarkedAsFail()) { activeMasterNodes.add(node); } } return activeMasterNodes; }
@Override public RedisClusterNode clusterGetNodeForSlot(int slot) { Iterable<RedisClusterNode> res = clusterGetNodes(); for (RedisClusterNode redisClusterNode : res) { if (redisClusterNode.isMaster() && redisClusterNode.getSlotRange().contains(slot)) { return redisClusterNode; } } return null; }
@Override public RedisClusterNode clusterGetNodeForSlot(int slot) { Iterable<RedisClusterNode> res = clusterGetNodes(); for (RedisClusterNode redisClusterNode : res) { if (redisClusterNode.isMaster() && redisClusterNode.getSlotRange().contains(slot)) { return redisClusterNode; } } return null; }
@Override public RedisClusterNode clusterGetNodeForSlot(int slot) { Iterable<RedisClusterNode> res = clusterGetNodes(); for (RedisClusterNode redisClusterNode : res) { if (redisClusterNode.isMaster() && redisClusterNode.getSlotRange().contains(slot)) { return redisClusterNode; } } return null; }
@Override public RedisClusterNode clusterGetNodeForSlot(int slot) { for (RedisClusterNode node : topologyProvider.getTopology().getSlotServingNodes(slot)) { if (node.isMaster()) { return node; } } return null; }
/** * Get the {@link RedisClusterNode} that is the current master serving the given key. * * @param key must not be {@literal null}. * @return never {@literal null}. * @throws ClusterStateFailureException */ public RedisClusterNode getKeyServingMasterNode(byte[] key) { Assert.notNull(key, "Key for node lookup must not be null!"); int slot = ClusterSlotHashUtil.calculateSlot(key); for (RedisClusterNode node : nodes) { if (node.isMaster() && node.servesSlot(slot)) { return node; } } throw new ClusterStateFailureException( String.format("Could not find master node serving slot %s for key '%s',", slot, Arrays.toString(key))); }
/** * Run {@link MultiKeyClusterCommandCallback} with on a curated set of nodes serving one or more keys. * * @param cmd must not be {@literal null}. * @return never {@literal null}. * @throws ClusterCommandExecutionFailureException */ public <S, T> MultiNodeResult<T> executeMultiKeyCommand(MultiKeyClusterCommandCallback<S, T> cmd, Iterable<byte[]> keys) { Map<RedisClusterNode, PositionalKeys> nodeKeyMap = new HashMap<>(); int index = 0; for (byte[] key : keys) { for (RedisClusterNode node : getClusterTopology().getKeyServingNodes(key)) { nodeKeyMap.computeIfAbsent(node, val -> PositionalKeys.empty()).append(PositionalKey.of(key, index++)); } } Map<NodeExecution, Future<NodeResult<T>>> futures = new LinkedHashMap<>(); for (Entry<RedisClusterNode, PositionalKeys> entry : nodeKeyMap.entrySet()) { if (entry.getKey().isMaster()) { for (PositionalKey key : entry.getValue()) { futures.put(new NodeExecution(entry.getKey(), key), executor.submit(() -> executeMultiKeyCommandOnSingleNode(cmd, entry.getKey(), key.getBytes()))); } } } return collectResults(futures); }
/** * Get all master nodes in cluster. * * @return never {@literal null}. */ public Set<RedisClusterNode> getMasterNodes() { Set<RedisClusterNode> masterNodes = new LinkedHashSet<>(nodes.size()); for (RedisClusterNode node : nodes) { if (node.isMaster()) { masterNodes.add(node); } } return masterNodes; }
/** * Get all master nodes in cluster. * * @return never {@literal null}. */ public Set<RedisClusterNode> getMasterNodes() { Set<RedisClusterNode> masterNodes = new LinkedHashSet<>(nodes.size()); for (RedisClusterNode node : nodes) { if (node.isMaster()) { masterNodes.add(node); } } return masterNodes; }
/** * Get all master nodes in cluster where {@code link-state} is {@literal connected} and {@code flags} does not contain * {@literal fail} or {@literal fail?}. * * @return never {@literal null}. */ public Set<RedisClusterNode> getActiveMasterNodes() { Set<RedisClusterNode> activeMasterNodes = new LinkedHashSet<>(nodes.size()); for (RedisClusterNode node : nodes) { if (node.isMaster() && node.isConnected() && !node.isMarkedAsFail()) { activeMasterNodes.add(node); } } return activeMasterNodes; }
/** * Get all master nodes in cluster where {@code link-state} is {@literal connected} and {@code flags} does not contain * {@literal fail} or {@literal fail?}. * * @return never {@literal null}. */ public Set<RedisClusterNode> getActiveMasterNodes() { Set<RedisClusterNode> activeMasterNodes = new LinkedHashSet<>(nodes.size()); for (RedisClusterNode node : nodes) { if (node.isMaster() && node.isConnected() && !node.isMarkedAsFail()) { activeMasterNodes.add(node); } } return activeMasterNodes; }
@Override public RedisClusterNode clusterGetNodeForSlot(int slot) { for (RedisClusterNode node : topologyProvider.getTopology().getSlotServingNodes(slot)) { if (node.isMaster()) { return node; } } return null; }
@Override public RedisClusterNode clusterGetNodeForSlot(int slot) { for (RedisClusterNode node : topologyProvider.getTopology().getSlotServingNodes(slot)) { if (node.isMaster()) { return node; } } return null; }
/** * Get the {@link RedisClusterNode} that is the current master serving the given key. * * @param key must not be {@literal null}. * @return never {@literal null}. * @throws ClusterStateFailureException */ public RedisClusterNode getKeyServingMasterNode(byte[] key) { Assert.notNull(key, "Key for node lookup must not be null!"); int slot = ClusterSlotHashUtil.calculateSlot(key); for (RedisClusterNode node : nodes) { if (node.isMaster() && node.servesSlot(slot)) { return node; } } throw new ClusterStateFailureException( String.format("Could not find master node serving slot %s for key '%s',", slot, Arrays.toString(key))); }
/** * Get the {@link RedisClusterNode} that is the current master serving the given key. * * @param key must not be {@literal null}. * @return never {@literal null}. * @throws ClusterStateFailureException */ public RedisClusterNode getKeyServingMasterNode(byte[] key) { Assert.notNull(key, "Key for node lookup must not be null!"); int slot = ClusterSlotHashUtil.calculateSlot(key); for (RedisClusterNode node : nodes) { if (node.isMaster() && node.servesSlot(slot)) { return node; } } throw new ClusterStateFailureException( String.format("Could not find master node serving slot %s for key '%s',", slot, Arrays.toString(key))); }
/** * Run {@link MultiKeyClusterCommandCallback} with on a curated set of nodes serving one or more keys. * * @param cmd must not be {@literal null}. * @return never {@literal null}. * @throws ClusterCommandExecutionFailureException */ public <S, T> MultiNodeResult<T> executeMultiKeyCommand(MultiKeyClusterCommandCallback<S, T> cmd, Iterable<byte[]> keys) { Map<RedisClusterNode, PositionalKeys> nodeKeyMap = new HashMap<>(); int index = 0; for (byte[] key : keys) { for (RedisClusterNode node : getClusterTopology().getKeyServingNodes(key)) { nodeKeyMap.computeIfAbsent(node, val -> PositionalKeys.empty()).append(PositionalKey.of(key, index++)); } } Map<NodeExecution, Future<NodeResult<T>>> futures = new LinkedHashMap<>(); for (Entry<RedisClusterNode, PositionalKeys> entry : nodeKeyMap.entrySet()) { if (entry.getKey().isMaster()) { for (PositionalKey key : entry.getValue()) { futures.put(new NodeExecution(entry.getKey(), key), executor.submit(() -> executeMultiKeyCommandOnSingleNode(cmd, entry.getKey(), key.getBytes()))); } } } return collectResults(futures); }