Script commands are supported.
This commit is contained in:
@@ -744,4 +744,25 @@ public class BinaryClient extends Connection {
|
|||||||
public void evalsha(byte[] sha1, List<byte[]> keys, List<byte[]> args){
|
public void evalsha(byte[] sha1, List<byte[]> keys, List<byte[]> args){
|
||||||
sendEvalCommand(EVALSHA, sha1, keys, args);
|
sendEvalCommand(EVALSHA, sha1, keys, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void scriptFlush(){
|
||||||
|
sendCommand(SCRIPT, Keyword.FLUSH.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scriptExists(byte[]... sha1){
|
||||||
|
byte[][] args = new byte[sha1.length + 1][];
|
||||||
|
args[0] = Keyword.EXISTS.raw;
|
||||||
|
for(int i=0;i<sha1.length; i++)
|
||||||
|
args[i+1] = sha1[i];
|
||||||
|
|
||||||
|
sendCommand(SCRIPT, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scriptLoad(byte[] script){
|
||||||
|
sendCommand(SCRIPT, Keyword.LOAD.raw, script);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scriptKill(){
|
||||||
|
sendCommand(SCRIPT, Keyword.KILL.raw);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package redis.clients.jedis;
|
package redis.clients.jedis;
|
||||||
|
|
||||||
|
import static redis.clients.jedis.Protocol.Command.SCRIPT;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@@ -9,6 +11,7 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import redis.clients.jedis.BinaryClient.LIST_POSITION;
|
import redis.clients.jedis.BinaryClient.LIST_POSITION;
|
||||||
|
import redis.clients.jedis.Protocol.Keyword;
|
||||||
import redis.clients.jedis.exceptions.JedisDataException;
|
import redis.clients.jedis.exceptions.JedisDataException;
|
||||||
import redis.clients.jedis.exceptions.JedisException;
|
import redis.clients.jedis.exceptions.JedisException;
|
||||||
import redis.clients.util.JedisByteHashMap;
|
import redis.clients.util.JedisByteHashMap;
|
||||||
@@ -1660,7 +1663,7 @@ public class BinaryJedis implements BinaryJedisCommands {
|
|||||||
public void disconnect() {
|
public void disconnect() {
|
||||||
client.disconnect();
|
client.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String watch(final byte[]... keys) {
|
public String watch(final byte[]... keys) {
|
||||||
client.watch(keys);
|
client.watch(keys);
|
||||||
return client.getStatusCodeReply();
|
return client.getStatusCodeReply();
|
||||||
@@ -3028,4 +3031,23 @@ public class BinaryJedis implements BinaryJedisCommands {
|
|||||||
public Object eval(byte[] script, List<byte[]> keys) {
|
public Object eval(byte[] script, List<byte[]> keys) {
|
||||||
return eval(script,keys, new ArrayList<byte[]>());
|
return eval(script,keys, new ArrayList<byte[]>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte[] scriptFlush(){
|
||||||
|
client.scriptFlush();
|
||||||
|
return client.getBinaryBulkReply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<byte[]> scriptExists(byte[]... sha1){
|
||||||
|
client.scriptExists(sha1);
|
||||||
|
return client.getBinaryMultiBulkReply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] scriptLoad(byte[] script){
|
||||||
|
client.scriptLoad(script);
|
||||||
|
return client.getBinaryBulkReply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scriptKill(){
|
||||||
|
client.scriptKill();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package redis.clients.jedis;
|
package redis.clients.jedis;
|
||||||
|
|
||||||
|
import redis.clients.jedis.Protocol.Keyword;
|
||||||
import redis.clients.util.SafeEncoder;
|
import redis.clients.util.SafeEncoder;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -9,6 +10,7 @@ import java.util.Map;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import static redis.clients.jedis.Protocol.toByteArray;
|
import static redis.clients.jedis.Protocol.toByteArray;
|
||||||
|
import static redis.clients.jedis.Protocol.Command.SCRIPT;
|
||||||
|
|
||||||
public class Client extends BinaryClient implements Commands {
|
public class Client extends BinaryClient implements Commands {
|
||||||
public Client(final String host) {
|
public Client(final String host) {
|
||||||
@@ -621,4 +623,16 @@ public class Client extends BinaryClient implements Commands {
|
|||||||
}
|
}
|
||||||
evalsha(SafeEncoder.encode(sha1),k,a);
|
evalsha(SafeEncoder.encode(sha1),k,a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void scriptExists(String... sha1){
|
||||||
|
final byte[][] bsha1 = new byte[sha1.length][];
|
||||||
|
for (int i = 0; i < bsha1.length; i++) {
|
||||||
|
bsha1[i] = SafeEncoder.encode(sha1[i]);
|
||||||
|
}
|
||||||
|
scriptExists(bsha1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scriptLoad(String script){
|
||||||
|
scriptLoad(SafeEncoder.encode(script));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2740,4 +2740,26 @@ public class Jedis extends BinaryJedis implements JedisCommands {
|
|||||||
|
|
||||||
return getEvalResult();
|
return getEvalResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean scriptExists(String sha1){
|
||||||
|
String[] a = new String[1];
|
||||||
|
a[0] = sha1;
|
||||||
|
return scriptExists(a).get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Boolean> scriptExists(String... sha1){
|
||||||
|
client.scriptExists(sha1);
|
||||||
|
List<Object> result = client.getObjectMultiBulkReply();
|
||||||
|
List<Boolean> exists = new ArrayList<Boolean>();
|
||||||
|
|
||||||
|
for(Object value : result)
|
||||||
|
exists.add(((Long)value) == 1);
|
||||||
|
|
||||||
|
return exists;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String scriptLoad(String script){
|
||||||
|
client.scriptLoad(script);
|
||||||
|
return client.getBulkReply();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -140,7 +140,7 @@ public final class Protocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static enum Command {
|
public static enum Command {
|
||||||
PING, SET, GET, QUIT, EXISTS, DEL, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT, SETRANGE, GETRANGE, EVAL, EVALSHA;
|
PING, SET, GET, QUIT, EXISTS, DEL, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT, SETRANGE, GETRANGE, EVAL, EVALSHA, SCRIPT;
|
||||||
|
|
||||||
public final byte[] raw;
|
public final byte[] raw;
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ public final class Protocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static enum Keyword {
|
public static enum Keyword {
|
||||||
AGGREGATE, ALPHA, ASC, BY, DESC, GET, LIMIT, MESSAGE, NO, NOSORT, PMESSAGE, PSUBSCRIBE, PUNSUBSCRIBE, OK, ONE, QUEUED, SET, STORE, SUBSCRIBE, UNSUBSCRIBE, WEIGHTS, WITHSCORES, RESETSTAT;
|
AGGREGATE, ALPHA, ASC, BY, DESC, GET, LIMIT, MESSAGE, NO, NOSORT, PMESSAGE, PSUBSCRIBE, PUNSUBSCRIBE, OK, ONE, QUEUED, SET, STORE, SUBSCRIBE, UNSUBSCRIBE, WEIGHTS, WITHSCORES, RESETSTAT, FLUSH, EXISTS, LOAD, KILL;
|
||||||
public final byte[] raw;
|
public final byte[] raw;
|
||||||
|
|
||||||
Keyword() {
|
Keyword() {
|
||||||
|
|||||||
@@ -0,0 +1,107 @@
|
|||||||
|
package redis.clients.jedis.tests.commands;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import redis.clients.jedis.exceptions.JedisDataException;
|
||||||
|
import redis.clients.jedis.exceptions.JedisException;
|
||||||
|
|
||||||
|
public class ScriptingCommandsTest extends JedisCommandTestBase {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
public void evalMultiBulk() {
|
||||||
|
String script = "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}";
|
||||||
|
List<String> keys = new ArrayList<String>();
|
||||||
|
keys.add("key1");
|
||||||
|
keys.add("key2");
|
||||||
|
|
||||||
|
List<String> response = (List<String>)jedis.eval(script, keys, "first", "second" );
|
||||||
|
|
||||||
|
assertEquals(4, response.size());
|
||||||
|
assertEquals("key1", response.get(0));
|
||||||
|
assertEquals("key2", response.get(1));
|
||||||
|
assertEquals("first", response.get(2));
|
||||||
|
assertEquals("second", response.get(3));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void evalBulk() {
|
||||||
|
String script = "return KEYS[1]";
|
||||||
|
List<String> keys = new ArrayList<String>();
|
||||||
|
keys.add("key1");
|
||||||
|
|
||||||
|
String response = (String)jedis.eval(script, keys);
|
||||||
|
|
||||||
|
assertEquals("key1", response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void evalInt() {
|
||||||
|
String script = "return 2";
|
||||||
|
List<String> keys = new ArrayList<String>();
|
||||||
|
keys.add("key1");
|
||||||
|
|
||||||
|
Long response = (Long)jedis.eval(script, keys);
|
||||||
|
|
||||||
|
assertEquals(new Long(2), response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void evalNoArgs() {
|
||||||
|
String script = "return KEYS[1]";
|
||||||
|
|
||||||
|
String response = (String)jedis.eval(script, "key1");
|
||||||
|
|
||||||
|
assertEquals("key1", response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
public void evalsha() {
|
||||||
|
jedis.set("foo", "bar");
|
||||||
|
jedis.eval("return redis.call('get','foo')");
|
||||||
|
String result = (String)jedis.evalsha("6b1bf486c81ceb7edf3c093f4c48582e38c0e791");
|
||||||
|
|
||||||
|
assertEquals("bar", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test(expected=JedisDataException.class)
|
||||||
|
public void evalshaShaNotFound() {
|
||||||
|
jedis.evalsha("ffffffffffffffffffffffffffffffffffffffff");
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
public void scriptFlush() {
|
||||||
|
jedis.set("foo", "bar");
|
||||||
|
jedis.eval("return redis.call('get','foo')");
|
||||||
|
jedis.scriptFlush();
|
||||||
|
assertFalse(jedis.scriptExists("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
public void scriptExists() {
|
||||||
|
jedis.scriptLoad("return redis.call('get','foo')");
|
||||||
|
List<Boolean> exists = jedis.scriptExists("ffffffffffffffffffffffffffffffffffffffff","6b1bf486c81ceb7edf3c093f4c48582e38c0e791");
|
||||||
|
assertFalse(exists.get(0));
|
||||||
|
assertTrue(exists.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
public void scriptLoad() {
|
||||||
|
jedis.scriptLoad("return redis.call('get','foo')");
|
||||||
|
assertTrue(jedis.scriptExists("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
public void scriptKill() {
|
||||||
|
jedis.scriptKill();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user