diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index ed1a614..d12a845 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -8,6 +8,9 @@ import static redis.clients.jedis.Protocol.Keyword.NO; import static redis.clients.jedis.Protocol.Keyword.ONE; import static redis.clients.jedis.Protocol.Keyword.RESET; import static redis.clients.jedis.Protocol.Keyword.STORE; +import static redis.clients.jedis.Protocol.Keyword.REFCOUNT; +import static redis.clients.jedis.Protocol.Keyword.ENCODING; +import static redis.clients.jedis.Protocol.Keyword.IDLETIME; import static redis.clients.jedis.Protocol.Keyword.WITHSCORES; import java.util.ArrayList; @@ -805,4 +808,16 @@ public class BinaryClient extends Connection { public void slowlogLen() { sendCommand(SLOWLOG, LEN.raw); } + + public void objectRefcount(byte[] key) { + sendCommand(OBJECT, REFCOUNT.raw, key); + } + + public void objectIdletime(byte[] key) { + sendCommand(OBJECT, IDLETIME.raw, key); + } + + public void objectEncoding(byte[] key) { + sendCommand(OBJECT, ENCODING.raw, key); + } } diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 173097f..1e38c35 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -3086,4 +3086,19 @@ public class BinaryJedis implements BinaryJedisCommands { client.slowlogGet(entries); return client.getBinaryMultiBulkReply(); } + + public Long objectRefcount(byte[] key) { + client.objectRefcount(key); + return client.getIntegerReply(); + } + + public byte[] objectEncoding(byte[] key) { + client.objectEncoding(key); + return client.getBinaryBulkReply(); + } + + public Long objectIdletime(byte[] key) { + client.objectIdletime(key); + return client.getIntegerReply(); + } } diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCommands.java b/src/main/java/redis/clients/jedis/BinaryJedisCommands.java index 5a3aea4..c6ba248 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCommands.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCommands.java @@ -102,7 +102,7 @@ public interface BinaryJedisCommands { byte[] srandmember(byte[] key); Long zadd(byte[] key, double score, byte[] member); - + Long zadd(byte[] key, Map scoreMembers); Set zrange(byte[] key, int start, int end); @@ -134,27 +134,32 @@ public interface BinaryJedisCommands { Set zrangeByScore(byte[] key, double min, double max); Set zrangeByScore(byte[] key, double min, double max, int offset, - int count); + int count); Set zrangeByScoreWithScores(byte[] key, double min, double max); Set zrangeByScoreWithScores(byte[] key, double min, double max, - int offset, int count); + int offset, int count); Set zrevrangeByScore(byte[] key, double max, double min); - Set zrevrangeByScore(byte[] key, double max, double min, int offset, - int count); + Set zrevrangeByScore(byte[] key, double max, double min, + int offset, int count); Set zrevrangeByScoreWithScores(byte[] key, double max, double min); Set zrevrangeByScoreWithScores(byte[] key, double max, double min, - int offset, int count); + int offset, int count); Long zremrangeByRank(byte[] key, int start, int end); Long zremrangeByScore(byte[] key, double start, double end); Long linsert(byte[] key, LIST_POSITION where, byte[] pivot, byte[] value); - + + Long objectRefcount(byte[] key); + + Long objectIdletime(byte[] key); + + byte[] objectEncoding(byte[] key); } diff --git a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java index eb051a4..b887cc6 100644 --- a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java @@ -413,4 +413,19 @@ public class BinaryShardedJedis extends Sharded pipeline.setShardedJedis(this); return pipeline; } -} + + public Long objectRefcount(byte[] key) { + Jedis j = getShard(key); + return j.objectRefcount(key); + } + + public byte[] objectEncoding(byte[] key) { + Jedis j = getShard(key); + return j.objectEncoding(key); + } + + public Long objectIdletime(byte[] key) { + Jedis j = getShard(key); + return j.objectIdletime(key); + } +} \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index e3b5cfe..dafc25f 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -636,4 +636,16 @@ public class Client extends BinaryClient implements Commands { zaddBinary(SafeEncoder.encode(key), binaryScoreMembers); } + + public void objectRefcount(String key) { + objectRefcount(SafeEncoder.encode(key)); + } + + public void objectIdletime(String key) { + objectIdletime(SafeEncoder.encode(key)); + } + + public void objectEncoding(String key) { + objectEncoding(SafeEncoder.encode(key)); + } } diff --git a/src/main/java/redis/clients/jedis/Commands.java b/src/main/java/redis/clients/jedis/Commands.java index 8e698b8..3768157 100644 --- a/src/main/java/redis/clients/jedis/Commands.java +++ b/src/main/java/redis/clients/jedis/Commands.java @@ -261,4 +261,10 @@ public interface Commands { public void exec(); public void discard(); -} + + public void objectRefcount(String key); + + public void objectIdletime(String key); + + public void objectEncoding(String key); +} \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 179c837..c87690c 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -2791,4 +2791,19 @@ public class Jedis extends BinaryJedis implements JedisCommands { client.slowlogGet(entries); return Slowlog.from(client.getObjectMultiBulkReply()); } + + public Long objectRefcount(String string) { + client.objectRefcount(string); + return client.getIntegerReply(); + } + + public String objectEncoding(String string) { + client.objectEncoding(string); + return client.getBulkReply(); + } + + public Long objectIdletime(String string) { + client.objectIdletime(string); + return client.getIntegerReply(); + } } diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 767ab04..b1e391d 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -144,7 +144,7 @@ public final class Protocol { } 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, SCRIPT, SLOWLOG; + 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, SLOWLOG, OBJECT; public final byte[] raw; @@ -154,12 +154,11 @@ public final class Protocol { } 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, RESET, FLUSH, EXISTS, LOAD, KILL, LEN; + AGGREGATE, ALPHA, ASC, BY, DESC, GET, LIMIT, MESSAGE, NO, NOSORT, PMESSAGE, PSUBSCRIBE, PUNSUBSCRIBE, OK, ONE, QUEUED, SET, STORE, SUBSCRIBE, UNSUBSCRIBE, WEIGHTS, WITHSCORES, RESETSTAT, RESET, FLUSH, EXISTS, LOAD, KILL, LEN, REFCOUNT, ENCODING, IDLETIME; public final byte[] raw; Keyword() { raw = SafeEncoder.encode(this.name().toLowerCase()); } - } } diff --git a/src/test/java/redis/clients/jedis/tests/commands/ObjectCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/ObjectCommandsTest.java new file mode 100644 index 0000000..0713753 --- /dev/null +++ b/src/test/java/redis/clients/jedis/tests/commands/ObjectCommandsTest.java @@ -0,0 +1,49 @@ +package redis.clients.jedis.tests.commands; + +import org.junit.Test; + +import redis.clients.util.SafeEncoder; + +public class ObjectCommandsTest extends JedisCommandTestBase { + + private String key = "mylist"; + private byte[] binaryKey = SafeEncoder.encode(key); + + @Test + public void objectRefcount() { + jedis.lpush(key, "hello world"); + Long refcount = jedis.objectRefcount(key); + assertEquals(new Long(1), refcount); + + // Binary + refcount = jedis.objectRefcount(binaryKey); + assertEquals(new Long(1), refcount); + + } + + @Test + public void objectEncoding() { + jedis.lpush(key, "hello world"); + String encoding = jedis.objectEncoding(key); + assertEquals("ziplist", encoding); + + // Binary + encoding = SafeEncoder.encode(jedis.objectEncoding(binaryKey)); + assertEquals("ziplist", encoding); + } + + @Test + public void objectIdletime() throws InterruptedException { + jedis.lpush(key, "hello world"); + + // Wait a little bit more than 10 seconds so the idle time is 10 + // seconds. + Thread.sleep(10001); + Long time = jedis.objectIdletime(key); + assertEquals(new Long(10), time); + + // Binary + time = jedis.objectIdletime(binaryKey); + assertEquals(new Long(10), time); + } +} \ No newline at end of file