From afefb71e57b0258a52b465b2b4e57c132aef4db9 Mon Sep 17 00:00:00 2001 From: Marcos Nils Date: Thu, 3 Apr 2014 22:01:15 -0300 Subject: [PATCH 1/2] Add support for HLL --- src/main/java/RedisTimeout.java | 50 +++++++++++++++++++ .../redis/clients/jedis/BinaryClient.java | 13 ++++- src/main/java/redis/clients/jedis/Client.java | 12 +++++ src/main/java/redis/clients/jedis/Jedis.java | 18 +++++++ .../java/redis/clients/jedis/Protocol.java | 2 +- .../commands/HyperLogLogCommandsTest.java | 46 +++++++++++++++++ 6 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 src/main/java/RedisTimeout.java create mode 100644 src/test/java/redis/clients/jedis/tests/commands/HyperLogLogCommandsTest.java diff --git a/src/main/java/RedisTimeout.java b/src/main/java/RedisTimeout.java new file mode 100644 index 0000000..2311080 --- /dev/null +++ b/src/main/java/RedisTimeout.java @@ -0,0 +1,50 @@ +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +public class RedisTimeout { + + public static void main(String[] args) { + // set k,v pairs where k == v + Jedis edis = new Jedis("127.0.0.1", 6379, 1000); + for (int i = 0; i < 100000; i++) { + edis.set("" + i, "" + i); + } + edis.close(); + JedisPoolConfig conf = new JedisPoolConfig(); + conf.setMaxTotal(1); + final JedisPool pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379, 1); + for (int t = 0; t < 100; t++) { + new Thread() { + public void run() { + + final Jedis edis = pool.getResource(); + // timeout + // = 1 + // here. + for (int i = 0; i < 1000; i++) { + try { + String key = "" + i; + String value = edis.get(key); + if (!key.equals(value)) { + System.err.println(Thread.currentThread() + .getName() + + "\t\t\t" + + key + + "<>" + + value); + } + } catch (Exception e) { + System.err.println(">>>>>>>>>>" + e.toString()); + e.printStackTrace(); + } + } + System.out.println("Done"); + pool.returnResource(edis); + }; + }.start(); + } + + } + +} \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 2377665..bbd0f8f 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -320,7 +320,7 @@ public class BinaryClient extends Connection { public void sadd(final byte[] key, final byte[]... members) { sendCommand(SADD, joinParameters(key, members)); } - + public void smembers(final byte[] key) { sendCommand(SMEMBERS, key); } @@ -1253,4 +1253,15 @@ public class BinaryClient extends Connection { public void asking() { sendCommand(Command.ASKING); } + + public void pfadd(final byte[] key, final byte[]... elements) { + sendCommand(PFADD, joinParameters(key, elements)); + } + + public void pfcount(final byte[] key) { + sendCommand(PFCOUNT, key); + } + public void pfmerge(final byte[] deskey, final byte[]... sourcekeys) { + sendCommand(PFMERGE, joinParameters(deskey, sourcekeys)); + } } diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 64f6f5c..f6b9529 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -951,4 +951,16 @@ public class Client extends BinaryClient implements Commands { cluster(Protocol.CLUSTER_SETSLOT, String.valueOf(slot), Protocol.CLUSTER_SETSLOT_IMPORTING, nodeId); } + + public void pfadd(String key, final String... elements) { + pfadd(SafeEncoder.encode(key), SafeEncoder.encodeMany(elements)); + } + + public void pfcount(final String key) { + pfcount(SafeEncoder.encode(key)); + } + + public void pfmerge(final String destkey, final String... sourcekeys) { + pfmerge(SafeEncoder.encode(destkey), SafeEncoder.encodeMany(sourcekeys)); + } } diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 4961f42..188140f 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -3412,4 +3412,22 @@ public class Jedis extends BinaryJedis implements JedisCommands, return BuilderFactory.STRING_MAP .build(client.getBinaryMultiBulkReply()); } + + public Long pfadd(final String key, String... elements) { + checkIsInMulti(); + client.pfadd(key, elements); + return client.getIntegerReply(); + } + + public long pfcount(final String key) { + checkIsInMulti(); + client.pfcount(key); + return client.getIntegerReply(); + } + + public String pfmerge(final String destkey, final String... sourcekeys) { + checkIsInMulti(); + client.pfmerge(destkey, sourcekeys); + return client.getStatusCodeReply(); + } } diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 681bc56..5ceccaa 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -208,7 +208,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, PUBSUB, 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, BITCOUNT, BITOP, SENTINEL, DUMP, RESTORE, PEXPIRE, PEXPIREAT, PTTL, INCRBYFLOAT, PSETEX, CLIENT, TIME, MIGRATE, HINCRBYFLOAT, SCAN, HSCAN, SSCAN, ZSCAN, WAIT, CLUSTER, ASKING; + 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, PUBSUB, 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, BITCOUNT, BITOP, SENTINEL, DUMP, RESTORE, PEXPIRE, PEXPIREAT, PTTL, INCRBYFLOAT, PSETEX, CLIENT, TIME, MIGRATE, HINCRBYFLOAT, SCAN, HSCAN, SSCAN, ZSCAN, WAIT, CLUSTER, ASKING, PFADD, PFCOUNT, PFMERGE; public final byte[] raw; diff --git a/src/test/java/redis/clients/jedis/tests/commands/HyperLogLogCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/HyperLogLogCommandsTest.java new file mode 100644 index 0000000..e14c59b --- /dev/null +++ b/src/test/java/redis/clients/jedis/tests/commands/HyperLogLogCommandsTest.java @@ -0,0 +1,46 @@ +package redis.clients.jedis.tests.commands; + +import org.junit.Test; + +public class HyperLogLogCommandsTest extends JedisCommandTestBase { + + + @Test + public void pfadd() { + long status = jedis.pfadd("foo", "a"); + assertEquals(1, status); + + status = jedis.pfadd("foo", "a"); + assertEquals(0, status); + } + + @Test + public void pfcount() { + long status = jedis.pfadd("hll", "foo", "bar", "zap"); + assertEquals(1, status); + + status = jedis.pfadd("hll", "zap", "zap", "zap"); + assertEquals(0, status); + + status = jedis.pfadd("hll", "foo", "bar"); + assertEquals(0, status); + + status = jedis.pfcount("hll"); + assertEquals(3, status); + } + + @Test + public void pfmerge() { + long status = jedis.pfadd("hll1", "foo", "bar", "zap", "a"); + assertEquals(1, status); + + status = jedis.pfadd("hll2", "a", "b", "c", "foo"); + assertEquals(1, status); + + String mergeStatus = jedis.pfmerge("hll3", "hll1", "hll2"); + assertEquals("OK", mergeStatus); + + status = jedis.pfcount("hll3"); + assertEquals(6, status); + } +} \ No newline at end of file From a6b76ae6651e840c0f4317548ff79223cc82b4ab Mon Sep 17 00:00:00 2001 From: Marcos Nils Date: Thu, 3 Apr 2014 22:05:40 -0300 Subject: [PATCH 2/2] Remove RedisTimeout that was added accidentally --- src/main/java/RedisTimeout.java | 50 --------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 src/main/java/RedisTimeout.java diff --git a/src/main/java/RedisTimeout.java b/src/main/java/RedisTimeout.java deleted file mode 100644 index 2311080..0000000 --- a/src/main/java/RedisTimeout.java +++ /dev/null @@ -1,50 +0,0 @@ -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; -import redis.clients.jedis.JedisPoolConfig; - -public class RedisTimeout { - - public static void main(String[] args) { - // set k,v pairs where k == v - Jedis edis = new Jedis("127.0.0.1", 6379, 1000); - for (int i = 0; i < 100000; i++) { - edis.set("" + i, "" + i); - } - edis.close(); - JedisPoolConfig conf = new JedisPoolConfig(); - conf.setMaxTotal(1); - final JedisPool pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379, 1); - for (int t = 0; t < 100; t++) { - new Thread() { - public void run() { - - final Jedis edis = pool.getResource(); - // timeout - // = 1 - // here. - for (int i = 0; i < 1000; i++) { - try { - String key = "" + i; - String value = edis.get(key); - if (!key.equals(value)) { - System.err.println(Thread.currentThread() - .getName() - + "\t\t\t" - + key - + "<>" - + value); - } - } catch (Exception e) { - System.err.println(">>>>>>>>>>" + e.toString()); - e.printStackTrace(); - } - } - System.out.println("Done"); - pool.returnResource(edis); - }; - }.start(); - } - - } - -} \ No newline at end of file