diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 4d21f7a..acb120b 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -1,26 +1,22 @@ package redis.clients.jedis; -import static redis.clients.jedis.Protocol.toByteArray; -import static redis.clients.jedis.Protocol.Command.*; -import static redis.clients.jedis.Protocol.Keyword.ENCODING; -import static redis.clients.jedis.Protocol.Keyword.IDLETIME; -import static redis.clients.jedis.Protocol.Keyword.LEN; -import static redis.clients.jedis.Protocol.Keyword.LIMIT; -import static redis.clients.jedis.Protocol.Keyword.NO; -import static redis.clients.jedis.Protocol.Keyword.ONE; -import static redis.clients.jedis.Protocol.Keyword.REFCOUNT; -import static redis.clients.jedis.Protocol.Keyword.RESET; -import static redis.clients.jedis.Protocol.Keyword.STORE; -import static redis.clients.jedis.Protocol.Keyword.WITHSCORES; +import redis.clients.jedis.Protocol.Command; +import redis.clients.jedis.Protocol.Keyword; +import redis.clients.util.SafeEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import redis.clients.jedis.Protocol.Command; -import redis.clients.jedis.Protocol.Keyword; -import redis.clients.util.SafeEncoder; +import static redis.clients.jedis.Protocol.Command.*; +import static redis.clients.jedis.Protocol.Command.EXISTS; +import static redis.clients.jedis.Protocol.Command.PSUBSCRIBE; +import static redis.clients.jedis.Protocol.Command.PUNSUBSCRIBE; +import static redis.clients.jedis.Protocol.Command.SUBSCRIBE; +import static redis.clients.jedis.Protocol.Command.UNSUBSCRIBE; +import static redis.clients.jedis.Protocol.Keyword.*; +import static redis.clients.jedis.Protocol.toByteArray; public class BinaryClient extends Connection { public enum LIST_POSITION { @@ -86,6 +82,11 @@ public class BinaryClient extends Connection { sendCommand(Command.SET, key, value); } + public void set(final byte[] key, final byte[] value, final byte[] nxxx, final byte[] expx, final long time) { + sendCommand(Command.SET, key, value, nxxx, expx, toByteArray(time)); + } + + public void get(final byte[] key) { sendCommand(Command.GET, key); } diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 89b42ae..3593014 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -1,22 +1,16 @@ package redis.clients.jedis; -import static redis.clients.jedis.Protocol.toByteArray; - -import java.net.URI; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import redis.clients.jedis.BinaryClient.LIST_POSITION; import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.exceptions.JedisException; import redis.clients.util.JedisByteHashMap; import redis.clients.util.SafeEncoder; +import java.net.URI; +import java.util.*; + +import static redis.clients.jedis.Protocol.toByteArray; + public class BinaryJedis implements BasicCommands, BinaryJedisCommands, MultiKeyBinaryCommands, AdvancedBinaryJedisCommands, BinaryScriptingCommands { protected Client client = null; @@ -78,6 +72,23 @@ public class BinaryJedis implements BasicCommands, BinaryJedisCommands, MultiKey return client.getStatusCodeReply(); } + /** + * Set the string value as value of the key. The string can't be longer than + * 1073741824 bytes (1 GB). + * @param key + * @param value + * @param nxxx NX|XX, NX -- Only set the key if it does not already exist. + * XX -- Only set the key if it already exist. + * @param expx EX|PX, expire time units: EX = seconds; PX = milliseconds + * @param time expire time in the units of {@param #expx} + * @return Status code reply + */ + public String set(final byte[] key, final byte[] value, final byte[] nxxx, final byte[] expx, final long time) { + checkIsInMulti(); + client.set(key, value, nxxx, expx, time); + return client.getStatusCodeReply(); + } + /** * Get the value of the specified key. If the key does not exist the special * value 'nil' is returned. If the value stored at key is not a string an diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index ce20fbc..8db267d 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -1,6 +1,6 @@ package redis.clients.jedis; -import static redis.clients.jedis.Protocol.toByteArray; +import redis.clients.util.SafeEncoder; import java.util.ArrayList; import java.util.HashMap; @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import redis.clients.util.SafeEncoder; +import static redis.clients.jedis.Protocol.toByteArray; public class Client extends BinaryClient implements Commands { public Client(final String host) { @@ -23,6 +23,10 @@ public class Client extends BinaryClient implements Commands { set(SafeEncoder.encode(key), SafeEncoder.encode(value)); } + public void set(final String key, final String value, final String nxxx, final String expx, final long time) { + set(SafeEncoder.encode(key), SafeEncoder.encode(value), SafeEncoder.encode(nxxx), SafeEncoder.encode(expx), time); + } + public void get(final String key) { get(SafeEncoder.encode(key)); } diff --git a/src/main/java/redis/clients/jedis/Commands.java b/src/main/java/redis/clients/jedis/Commands.java index 7d0e60d..851c065 100644 --- a/src/main/java/redis/clients/jedis/Commands.java +++ b/src/main/java/redis/clients/jedis/Commands.java @@ -1,13 +1,15 @@ package redis.clients.jedis; -import java.util.Map; - import redis.clients.jedis.BinaryClient.LIST_POSITION; +import java.util.Map; + public interface Commands { public void set(final String key, final String value); + public void set(final String key, final String value, final String nxxx, final String expx, final long time); + public void get(final String key); public void exists(final String key); diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 526459f..39de4cb 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -1,19 +1,12 @@ package redis.clients.jedis; -import java.net.URI; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import redis.clients.jedis.BinaryClient.LIST_POSITION; import redis.clients.util.SafeEncoder; import redis.clients.util.Slowlog; +import java.net.URI; +import java.util.*; + public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands, AdvancedJedisCommands, ScriptingCommands { public Jedis(final String host) { super(host); @@ -51,6 +44,23 @@ public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommand return client.getStatusCodeReply(); } + /** + * Set the string value as value of the key. The string can't be longer than + * 1073741824 bytes (1 GB). + * @param key + * @param value + * @param nxxx NX|XX, NX -- Only set the key if it does not already exist. + * XX -- Only set the key if it already exist. + * @param expx EX|PX, expire time units: EX = seconds; PX = milliseconds + * @param time expire time in the units of {@param #expx} + * @return Status code reply + */ + public String set(final String key, final String value, final String nxxx, final String expx, final long time) { + checkIsInMulti(); + client.set(key, value, nxxx, expx, time); + return client.getStatusCodeReply(); + } + /** * Get the value of the specified key. If the key does not exist the special * value 'nil' is returned. If the value stored at key is not a string an diff --git a/src/main/java/redis/clients/jedis/JedisCommands.java b/src/main/java/redis/clients/jedis/JedisCommands.java index ea5016b..a2bc07f 100644 --- a/src/main/java/redis/clients/jedis/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/JedisCommands.java @@ -7,7 +7,8 @@ import java.util.Set; /** * Common interface for sharded and non-sharded Jedis */ -public interface JedisCommands { +public interface + JedisCommands { String set(String key, String value); String get(String key); diff --git a/src/test/java/redis/clients/jedis/tests/commands/BinaryValuesCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/BinaryValuesCommandsTest.java index 87a5778..c232dbe 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/BinaryValuesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/BinaryValuesCommandsTest.java @@ -1,18 +1,23 @@ package redis.clients.jedis.tests.commands; +import org.junit.Before; +import org.junit.Test; +import redis.clients.jedis.Protocol.Keyword; +import redis.clients.jedis.exceptions.JedisDataException; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.junit.Before; -import org.junit.Test; - -import redis.clients.jedis.Protocol.Keyword; -import redis.clients.jedis.exceptions.JedisDataException; - public class BinaryValuesCommandsTest extends JedisCommandTestBase { byte[] bfoo = { 0x01, 0x02, 0x03, 0x04 }; byte[] bbar = { 0x05, 0x06, 0x07, 0x08 }; + byte[] bxx = { 0x78, 0x78 }; + byte[] bnx = { 0x6E, 0x78 }; + byte[] bex = { 0x65, 0x78 }; + byte[] bpx = { 0x70, 0x78 }; + long expireSeconds = 2; + long expireMillis = expireSeconds * 1000; byte[] binaryValue; @Before @@ -37,6 +42,69 @@ public class BinaryValuesCommandsTest extends JedisCommandTestBase { assertNull(jedis.get(bbar)); } + @Test + public void setNxExAndGet() { + String status = jedis.set(bfoo, binaryValue, bnx, bex, expireSeconds); + assertTrue(Keyword.OK.name().equalsIgnoreCase(status)); + byte[] value = jedis.get(bfoo); + assertTrue(Arrays.equals(binaryValue, value)); + + assertNull(jedis.get(bbar)); + } + + @Test + public void setIfNotExistAndGet() { + String status= jedis.set(bfoo, binaryValue); + assertTrue(Keyword.OK.name().equalsIgnoreCase(status)); + // nx should fail if value exists + String statusFail = jedis.set(bfoo, binaryValue, bnx, bex, expireSeconds); + assertNull(statusFail); + + byte[] value = jedis.get(bfoo); + assertTrue(Arrays.equals(binaryValue, value)); + + assertNull(jedis.get(bbar)); + } + + @Test + public void setIfExistAndGet() { + String status= jedis.set(bfoo, binaryValue); + assertTrue(Keyword.OK.name().equalsIgnoreCase(status)); + // nx should fail if value exists + String statusSuccess = jedis.set(bfoo, binaryValue, bxx, bex, expireSeconds); + assertTrue(Keyword.OK.name().equalsIgnoreCase(statusSuccess)); + + byte[] value = jedis.get(bfoo); + assertTrue(Arrays.equals(binaryValue, value)); + + assertNull(jedis.get(bbar)); + } + + @Test + public void setFailIfNotExistAndGet() { + // xx should fail if value does NOT exists + String statusFail = jedis.set(bfoo, binaryValue, bxx, bex, expireSeconds); + assertNull(statusFail); + } + + @Test + public void setAndExpireMillis() { + String status = jedis.set(bfoo, binaryValue, bnx, bpx, expireMillis); + assertTrue(Keyword.OK.name().equalsIgnoreCase(status)); + long ttl = jedis.ttl(bfoo); + assertTrue(ttl > 0 && ttl <= expireSeconds); + } + + + @Test + public void setAndExpire() { + String status = jedis.set(bfoo, binaryValue, bnx, bex, expireSeconds); + assertTrue(Keyword.OK.name().equalsIgnoreCase(status)); + long ttl = jedis.ttl(bfoo); + assertTrue(ttl > 0 && ttl <= expireSeconds); + } + + @Test public void getSet() { byte[] value = jedis.getSet(bfoo, binaryValue); diff --git a/src/test/java/redis/clients/jedis/tests/commands/JedisCommandTestBase.java b/src/test/java/redis/clients/jedis/tests/commands/JedisCommandTestBase.java index c88b388..8d92c4c 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/JedisCommandTestBase.java +++ b/src/test/java/redis/clients/jedis/tests/commands/JedisCommandTestBase.java @@ -1,19 +1,18 @@ package redis.clients.jedis.tests.commands; +import org.junit.After; +import org.junit.Before; +import org.junit.ComparisonFailure; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.tests.HostAndPortUtil; +import redis.clients.jedis.tests.HostAndPortUtil.HostAndPort; +import redis.clients.jedis.tests.JedisTestBase; + import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Set; -import org.junit.After; -import org.junit.Before; -import org.junit.ComparisonFailure; - -import redis.clients.jedis.Jedis; -import redis.clients.jedis.tests.HostAndPortUtil; -import redis.clients.jedis.tests.JedisTestBase; -import redis.clients.jedis.tests.HostAndPortUtil.HostAndPort; - public abstract class JedisCommandTestBase extends JedisTestBase { protected static HostAndPort hnp = HostAndPortUtil.getRedisServers().get(0);