From f59035fd6a3667b5cf1124edea9bacf78bdfff5e Mon Sep 17 00:00:00 2001 From: petetanton Date: Mon, 8 Jan 2018 11:20:45 +0000 Subject: [PATCH] new ReadFrom with a randomly order list of slaves --- .../com/lambdaworks/redis/ReadFromImpl.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/com/lambdaworks/redis/ReadFromImpl.java b/src/main/java/com/lambdaworks/redis/ReadFromImpl.java index 1cf86c5ad8..3418bcea47 100644 --- a/src/main/java/com/lambdaworks/redis/ReadFromImpl.java +++ b/src/main/java/com/lambdaworks/redis/ReadFromImpl.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Random; import com.lambdaworks.redis.internal.LettuceLists; import com.lambdaworks.redis.models.role.RedisInstance; @@ -121,6 +122,36 @@ public List select(Nodes nodes) { } } + /** + * Read from master and slaves. Prefer slave reads and fall back to master if the no slave is not available. Order slaves randomly. + */ + static final class ReadFromRandomSlavePreferred extends ReadFrom { + + private final Random rnd = new Random(System.nanoTime()); + + @Override + public List select(Nodes nodes) { + + List result = new ArrayList<>(nodes.getNodes().size()); + + for (RedisNodeDescription node : nodes) { + if (node.getRole() == RedisInstance.Role.SLAVE) { + result.add(node); + } + } + + Collections.shuffle(result, rnd); + + for (RedisNodeDescription node : nodes) { + if (node.getRole() == RedisInstance.Role.MASTER) { + result.add(node); + } + } + + return result; + } + } + /** * Read from nearest node. */