Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,7 @@
<include>**/ClientTestUtil.java</include>
<include>**/ReflectionTestUtil.java</include>
<include>**/*CommandFlags*.java</include>
<include>**/*CompareCondition*.java</include>
<include>**/*MSetExParams*.java</include>
</includes>
</configuration>
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/redis/clients/jedis/CommandObjects.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import redis.clients.jedis.timeseries.*;
import redis.clients.jedis.timeseries.TimeSeriesProtocol.*;
import redis.clients.jedis.util.KeyValue;
import redis.clients.jedis.util.CompareCondition;

public class CommandObjects {

Expand Down Expand Up @@ -346,6 +347,18 @@ public final CommandObject<Long> del(byte[]... keys) {
return new CommandObject<>(commandArguments(DEL).keys((Object[]) keys), BuilderFactory.LONG);
}

public final CommandObject<Long> delex(String key, CompareCondition cond) {
CommandArguments ca = commandArguments(Command.DELEX).key(key);
cond.addTo(ca);
return new CommandObject<>(ca, BuilderFactory.LONG);
}

public final CommandObject<Long> delex(byte[] key, CompareCondition cond) {
CommandArguments ca = commandArguments(Command.DELEX).key(key);
cond.addTo(ca);
return new CommandObject<>(ca, BuilderFactory.LONG);
}

public final CommandObject<Long> unlink(String key) {
return new CommandObject<>(commandArguments(UNLINK).key(key), BuilderFactory.LONG);
}
Expand Down Expand Up @@ -462,6 +475,10 @@ public final CommandObject<String> get(String key) {
return new CommandObject<>(commandArguments(Command.GET).key(key), BuilderFactory.STRING);
}

public final CommandObject<String> digestKey(String key) {
return new CommandObject<>(commandArguments(Command.DIGEST).key(key), BuilderFactory.STRING);
}

public final CommandObject<String> setGet(String key, String value) {
return new CommandObject<>(commandArguments(Command.SET).key(key).add(value).add(Keyword.GET), BuilderFactory.STRING);
}
Expand All @@ -479,6 +496,10 @@ public final CommandObject<String> getEx(String key, GetExParams params) {
return new CommandObject<>(commandArguments(Command.GETEX).key(key).addParams(params), BuilderFactory.STRING);
}

public final CommandObject<byte[]> digestKey(byte[] key) {
return new CommandObject<>(commandArguments(Command.DIGEST).key(key), BuilderFactory.BINARY);
}

public final CommandObject<byte[]> get(byte[] key) {
return new CommandObject<>(commandArguments(Command.GET).key(key), BuilderFactory.BINARY);
}
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/redis/clients/jedis/Jedis.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import redis.clients.jedis.Protocol.*;
import redis.clients.jedis.args.*;
import redis.clients.jedis.commands.*;
import redis.clients.jedis.util.CompareCondition;
import redis.clients.jedis.exceptions.InvalidURIException;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.exceptions.JedisException;
Expand Down Expand Up @@ -505,6 +506,12 @@ public byte[] get(final byte[] key) {
return connection.executeCommand(commandObjects.get(key));
}

@Override
public byte[] digestKey(final byte[] key) {
checkIsInMultiOrPipeline();
return connection.executeCommand(commandObjects.digestKey(key));
}

@Override
public byte[] setGet(final byte[] key, final byte[] value) {
checkIsInMultiOrPipeline();
Expand Down Expand Up @@ -573,6 +580,12 @@ public long del(final byte[]... keys) {
checkIsInMultiOrPipeline();
return connection.executeCommand(commandObjects.del(keys));
}
@Override
public long delex(final byte[] key, final CompareCondition condition) {
checkIsInMultiOrPipeline();
return connection.executeCommand(commandObjects.delex(key, condition));
}


@Override
public long del(final byte[] key) {
Expand Down Expand Up @@ -5153,6 +5166,18 @@ public String getEx(String key, GetExParams params) {
return connection.executeCommand(commandObjects.getEx(key, params));
}

@Override
public String digestKey(final String key) {
checkIsInMultiOrPipeline();
return connection.executeCommand(commandObjects.digestKey(key));
}

@Override
public long delex(final String key, final CompareCondition condition) {
checkIsInMultiOrPipeline();
return connection.executeCommand(commandObjects.delex(key, condition));
}

/**
* Test if the specified keys exist. The command returns the number of keys exist.
* Time complexity: O(N)
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/redis/clients/jedis/Protocol.java
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ public static final byte[] toByteArray(final double value) {

public static enum Command implements ProtocolCommand {

PING, AUTH, HELLO, SET, GET, GETDEL, GETEX, EXISTS, DEL, UNLINK, TYPE, FLUSHDB, FLUSHALL, MOVE,
PING, AUTH, HELLO, SET, GET, GETDEL, GETEX, DIGEST, EXISTS, DEL, DELEX, UNLINK, TYPE, FLUSHDB, FLUSHALL, MOVE,
KEYS, RANDOMKEY, RENAME, RENAMENX, DUMP, RESTORE, DBSIZE, SELECT, SWAPDB, MIGRATE, ECHO, //
EXPIRE, EXPIREAT, EXPIRETIME, PEXPIRE, PEXPIREAT, PEXPIRETIME, TTL, PTTL, // <-- key expiration
MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, SORT_RO, INFO, SHUTDOWN, MONITOR, CONFIG, LCS, //
Expand Down Expand Up @@ -334,7 +334,7 @@ public static enum Keyword implements Rawable {
STREAMS, CREATE, MKSTREAM, SETID, DESTROY, DELCONSUMER, MAXLEN, GROUP, IDLE, TIME, BLOCK, NOACK, CLAIM,
RETRYCOUNT, STREAM, GROUPS, CONSUMERS, JUSTID, WITHVALUES, NOMKSTREAM, MINID, CREATECONSUMER,
SETUSER, GETUSER, DELUSER, WHOAMI, USERS, CAT, GENPASS, LOG, SAVE, DRYRUN, COPY, AUTH, AUTH2,
NX, XX, EX, PX, EXAT, PXAT, ABSTTL, KEEPTTL, INCR, LT, GT, CH, INFO, PAUSE, UNPAUSE, UNBLOCK,
NX, XX, IFEQ, IFNE, IFDEQ, IFDNE, EX, PX, EXAT, PXAT, ABSTTL, KEEPTTL, INCR, LT, GT, CH, INFO, PAUSE, UNPAUSE, UNBLOCK,
REV, WITHCOORD, WITHDIST, WITHHASH, ANY, FROMMEMBER, FROMLONLAT, BYRADIUS, BYBOX, BYLEX, BYSCORE,
STOREDIST, TO, FORCE, TIMEOUT, DB, UNLOAD, ABORT, IDX, MINMATCHLEN, WITHMATCHLEN, FULL,
DELETE, LIBRARYNAME, WITHCODE, DESCRIPTION, GETKEYS, GETKEYSANDFLAGS, DOCS, FILTERBY, DUMP,
Expand Down
22 changes: 21 additions & 1 deletion src/main/java/redis/clients/jedis/UnifiedJedis.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import redis.clients.jedis.commands.SampleBinaryKeyedCommands;
import redis.clients.jedis.commands.SampleKeyedCommands;
import redis.clients.jedis.commands.RedisModuleCommands;
import redis.clients.jedis.util.CompareCondition;
import redis.clients.jedis.csc.Cache;
import redis.clients.jedis.csc.CacheConfig;
import redis.clients.jedis.csc.CacheConnection;
Expand All @@ -26,7 +27,6 @@
import redis.clients.jedis.json.JsonSetParams;
import redis.clients.jedis.json.Path;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.mcf.MultiDbCommandExecutor;
import redis.clients.jedis.params.VAddParams;
import redis.clients.jedis.params.VSimParams;
import redis.clients.jedis.resps.RawVector;
Expand Down Expand Up @@ -585,6 +585,11 @@ public long del(String key) {
return executeCommand(commandObjects.del(key));
}

@Override
public long delex(String key, CompareCondition condition) {
return executeCommand(commandObjects.delex(key, condition));
}

@Override
public long del(String... keys) {
return executeCommand(commandObjects.del(keys));
Expand All @@ -595,6 +600,11 @@ public long unlink(String key) {
return executeCommand(commandObjects.unlink(key));
}

@Override
public long delex(byte[] key, CompareCondition condition) {
return executeCommand(commandObjects.delex(key, condition));
}

@Override
public long unlink(String... keys) {
return executeCommand(commandObjects.unlink(keys));
Expand Down Expand Up @@ -760,6 +770,11 @@ public String get(String key) {
return executeCommand(commandObjects.get(key));
}

@Override
public String digestKey(String key) {
return executeCommand(commandObjects.digestKey(key));
}

@Override
public String setGet(String key, String value) {
return executeCommand(commandObjects.setGet(key, value));
Expand Down Expand Up @@ -795,6 +810,11 @@ public byte[] get(byte[] key) {
return executeCommand(commandObjects.get(key));
}

@Override
public byte[] digestKey(byte[] key) {
return executeCommand(commandObjects.digestKey(key));
}

@Override
public byte[] setGet(byte[] key, byte[] value) {
return executeCommand(commandObjects.setGet(key, value));
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/redis/clients/jedis/commands/KeyBinaryCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import redis.clients.jedis.args.ExpiryOption;
import redis.clients.jedis.params.MigrateParams;
import redis.clients.jedis.params.RestoreParams;
import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.util.CompareCondition;
import redis.clients.jedis.params.ScanParams;
import redis.clients.jedis.params.SortingParams;
import redis.clients.jedis.resps.ScanResult;
Expand Down Expand Up @@ -60,6 +62,16 @@ public interface KeyBinaryCommands {

long del(byte[] key);

/**
* Experimental: Compare-and-delete guarded by value/digest condition.
*/
@Experimental
long delex(byte[] key, CompareCondition condition);

/** Returns the 64-bit XXH3 digest hex (ASCII bytes) of the string value stored at key, or null if missing. */
@Experimental
byte[] digestKey(byte[] key);

long del(byte[]... keys);

long unlink(byte[] key);
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/redis/clients/jedis/commands/KeyCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import redis.clients.jedis.args.ExpiryOption;
import redis.clients.jedis.params.MigrateParams;
import redis.clients.jedis.params.RestoreParams;
import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.util.CompareCondition;
import redis.clients.jedis.params.ScanParams;
import redis.clients.jedis.params.SortingParams;
import redis.clients.jedis.resps.ScanResult;
Expand Down Expand Up @@ -418,6 +420,19 @@ public interface KeyCommands {
*/
long del(String... keys);

/**
* Experimental: Compare-and-delete guarded by value/digest condition.
*/
@Experimental
long delex(String key, CompareCondition condition);

/**
* Compute and return the 64-bit XXH3 digest hex of the string value stored at key. Returns null
* if key does not exist.
*/
@Experimental
String digestKey(String key);

/**
* <b><a href="http://redis.io/commands/unlink">Unlink Command</a></b>
* This command is very similar to {@link KeyCommands#del(String) DEL}: it removes the specified key.
Expand Down
25 changes: 23 additions & 2 deletions src/main/java/redis/clients/jedis/params/SetParams.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@

import redis.clients.jedis.CommandArguments;
import redis.clients.jedis.Protocol.Keyword;
import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.util.CompareCondition;

public class SetParams extends BaseSetExParams<SetParams> {

private Keyword existance;
private CompareCondition condition;

public static SetParams setParams() {
return new SetParams();
Expand Down Expand Up @@ -91,8 +94,24 @@ public SetParams keepTtl() {
return super.keepTtl();
}

/**
* Set a compare condition for compare-and-set operations.
* @param condition the condition to apply
* @return {@link SetParams}
*/
@Experimental
public SetParams condition(CompareCondition condition) {
this.condition = condition;
return this;
}

@Override
public void addParams(CommandArguments args) {
// Condition must be added before NX/XX per Redis command syntax
if (condition != null) {
condition.addTo(args);
}

if (existance != null) {
args.add(existance);
}
Expand All @@ -105,11 +124,13 @@ public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SetParams setParams = (SetParams) o;
return Objects.equals(existance, setParams.existance) && super.equals((BaseSetExParams) o);
return Objects.equals(existance, setParams.existance)
&& Objects.equals(condition, setParams.condition)
&& super.equals((BaseSetExParams) o);
}

@Override
public int hashCode() {
return Objects.hash(existance, super.hashCode());
return Objects.hash(existance, condition, super.hashCode());
}
}
Loading
Loading