From bc86b1210b60f24af5abc864ebb7b0d3f6c9a918 Mon Sep 17 00:00:00 2001 From: anthonyu Date: Tue, 20 Aug 2013 19:43:32 -0700 Subject: [PATCH] Pipeline eval and evalsha. --- README.md | 3 +- src/main/java/redis/clients/jedis/Jedis.java | 2 +- .../redis/clients/jedis/PipelineBase.java | 29 ++++++++ .../clients/jedis/tests/PipeliningTest.java | 66 +++++++++++++++++++ 4 files changed, 98 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ae89c9f..02cc666 100644 --- a/README.md +++ b/README.md @@ -37,9 +37,10 @@ All of the following redis features are supported: - Persistence control commands - Remote server control commands - Connection pooling -- Sharding (MD5, MurmureHash) +- Sharding (MD5, MurmurHash) - Key-tags for sharding - Sharding with pipelining +- Scripting with pipelining ## How do I use it? diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index f30990d..8dedfcc 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -2739,7 +2739,7 @@ public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommand client.rollbackTimeout(); } - private String[] getParams(List keys, List args) { + protected static String[] getParams(List keys, List args) { int keyCount = keys.size(); int argCount = args.size(); diff --git a/src/main/java/redis/clients/jedis/PipelineBase.java b/src/main/java/redis/clients/jedis/PipelineBase.java index 2ceeeec..1ec4872 100644 --- a/src/main/java/redis/clients/jedis/PipelineBase.java +++ b/src/main/java/redis/clients/jedis/PipelineBase.java @@ -959,4 +959,33 @@ abstract class PipelineBase extends Queable implements return getResponse(BuilderFactory.LONG); } + public Response eval(String script) { + return this.eval(script, 0, new String[0]); + } + + public Response eval(String script, List keys, List args) { + String[] argv = Jedis.getParams(keys, args); + return this.eval(script, keys.size(), argv); + } + + public Response eval(String script, int numKeys, String[] argv) { + getClient(script).eval(script, numKeys, argv); + return getResponse(BuilderFactory.STRING); + } + + public Response evalsha(String script) { + return this.evalsha(script, 0, new String[0]); + } + + public Response evalsha(String sha1, List keys, List args) { + String[] argv = Jedis.getParams(keys, args); + return this.evalsha(sha1, keys.size(), argv); + } + + public Response evalsha(String sha1, int numKeys, String[] argv) { + getClient(sha1).evalsha(sha1, numKeys, argv); + return getResponse(BuilderFactory.STRING); + } + + } diff --git a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java index ffe2c9b..cd2984b 100755 --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -242,4 +242,70 @@ public class PipeliningTest extends Assert { assertEquals(new Long(-3), r3.get().get(1)); } + + @Test + public void testEval(){ + String script = "return 'success!'"; + + Pipeline p = jedis.pipelined(); + Response result = p.eval(script); + p.sync(); + + assertEquals("success!", result.get()); + } + + @Test + public void testEvalKeyAndArg(){ + String key = "test"; + String arg = "3"; + String script = "redis.call('INCRBY', KEYS[1], ARGV[1]) redis.call('INCRBY', KEYS[1], ARGV[1])"; + + Pipeline p = jedis.pipelined(); + p.set(key, "0"); + Response result0 = p.eval(script, Arrays.asList(key), Arrays.asList(arg)); + p.incr(key); + Response result1 = p.eval(script, Arrays.asList(key), Arrays.asList(arg)); + Response result2 = p.get(key); + p.sync(); + + assertNull(result0.get()); + assertNull(result1.get()); + assertEquals("13", result2.get()); + } + + @Test + public void testEvalsha(){ + String script = "return 'success!'"; + String sha1 = jedis.scriptLoad(script); + + assertTrue(jedis.scriptExists(sha1)); + + Pipeline p = jedis.pipelined(); + Response result = p.evalsha(sha1); + p.sync(); + + assertEquals("success!", result.get()); + } + + @Test + public void testEvalshaKeyAndArg(){ + String key = "test"; + String arg = "3"; + String script = "redis.call('INCRBY', KEYS[1], ARGV[1]) redis.call('INCRBY', KEYS[1], ARGV[1])"; + String sha1 = jedis.scriptLoad(script); + + assertTrue(jedis.scriptExists(sha1)); + + Pipeline p = jedis.pipelined(); + p.set(key, "0"); + Response result0 = p.evalsha(sha1, Arrays.asList(key), Arrays.asList(arg)); + p.incr(key); + Response result1 = p.evalsha(sha1, Arrays.asList(key), Arrays.asList(arg)); + Response result2 = p.get(key); + p.sync(); + + assertNull(result0.get()); + assertNull(result1.get()); + assertEquals("13", result2.get()); + } }