diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 26fc4a1..6b6c626 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -2015,10 +2015,19 @@ public class BinaryJedis implements BinaryJedisCommands { return client.getStatusCodeReply(); } + /** + * Starts a pipeline, which is a very efficient way to send lots of command + * and read all the responses when you finish sending them. Try to avoid + * this version and use pipelined() when possible as it will give better + * performance. + * + * @param jedisPipeline + * @return The results of the command in the same order you've run them. + */ public List pipelined(final PipelineBlock jedisPipeline) { jedisPipeline.setClient(client); jedisPipeline.execute(); - return jedisPipeline.sync(); + return jedisPipeline.syncAndReturnAll(); } public Pipeline pipelined() { diff --git a/src/main/java/redis/clients/jedis/Pipeline.java b/src/main/java/redis/clients/jedis/Pipeline.java index 40d8030..20aa9e5 100644 --- a/src/main/java/redis/clients/jedis/Pipeline.java +++ b/src/main/java/redis/clients/jedis/Pipeline.java @@ -14,7 +14,28 @@ public class Pipeline extends Queable { this.client = client; } - public List sync() { + /** + * Syncronize pipeline by reading all responses. This operation close the + * pipeline. In order to get return values from pipelined commands, capture + * the different Response of the commands you execute. + */ + public void sync() { + List unformatted = client.getAll(); + for (Object o : unformatted) { + generateResponse(o); + } + } + + /** + * Syncronize pipeline by reading all responses. This operation close the + * pipeline. Whenever possible try to avoid using this version and use + * Pipeline.sync() as it won't go through all the responses and generate the + * right response type (usually it is a waste of time). + * + * @return A list of all the responses in the order you executed them. + * @see sync + */ + public List syncAndReturnAll() { List unformatted = client.getAll(); List formatted = new ArrayList(); for (Object o : unformatted) { diff --git a/src/main/java/redis/clients/jedis/Response.java b/src/main/java/redis/clients/jedis/Response.java index 13a77cb..062e97d 100644 --- a/src/main/java/redis/clients/jedis/Response.java +++ b/src/main/java/redis/clients/jedis/Response.java @@ -5,22 +5,29 @@ import redis.clients.jedis.exceptions.JedisDataException; public class Response { protected T response = null; private boolean built = false; + private boolean set = false; private Builder builder; + private Object data; public Response(Builder b) { this.builder = b; } public void set(Object data) { - response = builder.build(data); - built = true; + this.data = data; + set = true; } public T get() { - if (!built) { + if (!set) { throw new JedisDataException( "Please close pipeline or multi block before calling this method."); } + if (!built) { + response = builder.build(data); + this.data = null; + built = true; + } return response; } diff --git a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java index cb82fd1..4ab50b0 100644 --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -46,7 +46,7 @@ public class PipeliningTest extends Assert { Pipeline p = jedis.pipelined(); p.set("foo", "bar"); p.get("foo"); - results = p.sync(); + results = p.syncAndReturnAll(); assertEquals(2, results.size()); assertEquals("OK", results.get(0)); diff --git a/src/test/java/redis/clients/jedis/tests/benchmark/PipelinedGetSetBenchmark.java b/src/test/java/redis/clients/jedis/tests/benchmark/PipelinedGetSetBenchmark.java index 13d7a6d..ae2f024 100644 --- a/src/test/java/redis/clients/jedis/tests/benchmark/PipelinedGetSetBenchmark.java +++ b/src/test/java/redis/clients/jedis/tests/benchmark/PipelinedGetSetBenchmark.java @@ -5,7 +5,7 @@ import java.net.UnknownHostException; import java.util.Calendar; import redis.clients.jedis.Jedis; -import redis.clients.jedis.PipelineBlock; +import redis.clients.jedis.Pipeline; import redis.clients.jedis.tests.HostAndPortUtil; import redis.clients.jedis.tests.HostAndPortUtil.HostAndPort; @@ -22,15 +22,13 @@ public class PipelinedGetSetBenchmark { long begin = Calendar.getInstance().getTimeInMillis(); - jedis.pipelined(new PipelineBlock() { - public void execute() { - for (int n = 0; n <= TOTAL_OPERATIONS; n++) { - String key = "foo" + n; - set(key, "bar" + n); - get(key); - } - } - }); + Pipeline p = jedis.pipelined(); + for (int n = 0; n <= TOTAL_OPERATIONS; n++) { + String key = "foo" + n; + p.set(key, "bar" + n); + p.get(key); + } + p.sync(); long elapsed = Calendar.getInstance().getTimeInMillis() - begin;