Skip to content

Add support for HRANDFIELD and ZRANDMEMBER #2104

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
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
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.6.0-SNAPSHOT</version>
<version>2.6.0-2049-SNAPSHOT</version>

<name>Spring Data Redis</name>

Expand Down
2 changes: 1 addition & 1 deletion src/main/asciidoc/new-features.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This section briefly covers items that are new and noteworthy in the latest rele
== New in Spring Data Redis 2.6

* Support for `SubscriptionListener` when using `MessageListener` for subscription confirmation callbacks. `ReactiveRedisMessageListenerContainer` and `ReactiveRedisOperations` provide `receiveLater(…)` and `listenToLater(…)` methods to await until Redis acknowledges the subscription.
* Support Redis 6.2 commands (`LPOP`/`RPOP` with `count`, `COPY`, `GETEX`, `GETDEL`).
* Support Redis 6.2 commands (`LPOP`/`RPOP` with `count`, `COPY`, `GETEX`, `GETDEL`, `HRANDFIELD`, `ZRANDMEMBER`).

[[new-in-2.5.0]]
== New in Spring Data Redis 2.5
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.core.convert.converter.Converter;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
Expand Down Expand Up @@ -83,6 +84,7 @@ public class DefaultStringRedisConnection implements StringRedisConnection, Deco
private Converter<String, byte[]> stringToBytes = new SerializingConverter();
private SetConverter<Tuple, StringTuple> tupleToStringTuple = new SetConverter<>(new TupleConverter());
private SetConverter<StringTuple, Tuple> stringTupleToTuple = new SetConverter<>(new StringTupleConverter());
private ListConverter<Tuple, StringTuple> tupleListToStringTuple = new ListConverter<>(new TupleConverter());
private ListConverter<byte[], String> byteListToStringList = new ListConverter<>(bytesToString);
private MapConverter<byte[], String> byteMapToStringMap = new MapConverter<>(bytesToString);
private MapConverter<String, byte[]> stringMapToByteMap = new MapConverter<>(stringToBytes);
Expand All @@ -104,6 +106,26 @@ public StringRecord convert(ByteRecord source) {
@SuppressWarnings("rawtypes") private Queue<Converter> txConverters = new LinkedList<>();
private boolean deserializePipelineAndTxResults = false;

private Entry<String, String> convertEntry(Entry<byte[], byte[]> source) {
return new Entry<String, String>() {

@Override
public String getKey() {
return bytesToString.convert(source.getKey());
}

@Override
public String getValue() {
return bytesToString.convert(source.getValue());
}

@Override
public String setValue(String value) {
throw new UnsupportedOperationException("Cannot set value for entry");
}
};
}

private class DeserializingConverter implements Converter<byte[], String> {
public String convert(byte[] source) {
return serializer.deserialize(source);
Expand Down Expand Up @@ -277,7 +299,6 @@ public Long decrBy(byte[] key, long value) {
return convertAndReturn(delegate.decrBy(key, value), Converters.identityConverter());
}


/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisKeyCommands#del(byte[][])
Expand Down Expand Up @@ -1530,7 +1551,8 @@ public Set<byte[]> zRangeByScore(byte[] key, double min, double max) {
*/
@Override
public Set<Tuple> zRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) {
return convertAndReturn(delegate.zRangeByScoreWithScores(key, min, max, offset, count), Converters.identityConverter());
return convertAndReturn(delegate.zRangeByScoreWithScores(key, min, max, offset, count),
Converters.identityConverter());
}

/*
Expand Down Expand Up @@ -1602,7 +1624,8 @@ public Set<byte[]> zRevRangeByScore(byte[] key, Range range, Limit limit) {
*/
@Override
public Set<Tuple> zRevRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) {
return convertAndReturn(delegate.zRevRangeByScoreWithScores(key, min, max, offset, count), Converters.identityConverter());
return convertAndReturn(delegate.zRevRangeByScoreWithScores(key, min, max, offset, count),
Converters.identityConverter());
}

/*
Expand Down Expand Up @@ -1853,7 +1876,8 @@ public <T> T eval(byte[] script, ReturnType returnType, int numKeys, byte[]... k
*/
@Override
public <T> T evalSha(String scriptSha1, ReturnType returnType, int numKeys, byte[]... keysAndArgs) {
return convertAndReturn(delegate.evalSha(scriptSha1, returnType, numKeys, keysAndArgs), Converters.identityConverter());
return convertAndReturn(delegate.evalSha(scriptSha1, returnType, numKeys, keysAndArgs),
Converters.identityConverter());
}

/*
Expand All @@ -1862,7 +1886,8 @@ public <T> T evalSha(String scriptSha1, ReturnType returnType, int numKeys, byte
*/
@Override
public <T> T evalSha(byte[] scriptSha1, ReturnType returnType, int numKeys, byte[]... keysAndArgs) {
return convertAndReturn(delegate.evalSha(scriptSha1, returnType, numKeys, keysAndArgs), Converters.identityConverter());
return convertAndReturn(delegate.evalSha(scriptSha1, returnType, numKeys, keysAndArgs),
Converters.identityConverter());
}

//
Expand Down Expand Up @@ -1949,6 +1974,7 @@ public String bRPopLPush(int timeout, String srcKey, String dstKey) {
public Boolean copy(String sourceKey, String targetKey, boolean replace) {
return copy(serialize(sourceKey), serialize(targetKey), replace);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#decr(java.lang.String)
Expand Down Expand Up @@ -1976,7 +2002,6 @@ public Long del(String... keys) {
return del(serializeMulti(keys));
}


/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#unlink(java.lang.String[])
Expand Down Expand Up @@ -2112,6 +2137,88 @@ public Double hIncrBy(String key, String field, double delta) {
return hIncrBy(serialize(key), serialize(field), delta);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisHashCommands#hRandField(byte[])
*/
@Nullable
@Override
public byte[] hRandField(byte[] key) {
return convertAndReturn(delegate.hRandField(key), Converters.identityConverter());
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisHashCommands#hRandFieldWithValues(byte[])
*/
@Nullable
@Override
public Entry<byte[], byte[]> hRandFieldWithValues(byte[] key) {
return convertAndReturn(delegate.hRandFieldWithValues(key), Converters.identityConverter());
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisHashCommands#hRandField(byte[], long)
*/
@Nullable
@Override
public List<byte[]> hRandField(byte[] key, long count) {
return convertAndReturn(delegate.hRandField(key, count), Converters.identityConverter());
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisHashCommands#hRandFieldWithValues(byte[], long)
*/
@Nullable
@Override
public List<Entry<byte[], byte[]>> hRandFieldWithValues(byte[] key, long count) {
return convertAndReturn(delegate.hRandFieldWithValues(key, count), Converters.identityConverter());
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#hRandField(java.lang.String)
*/
@Nullable
@Override
public String hRandField(String key) {
return convertAndReturn(delegate.hRandField(serialize(key)), bytesToString);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#hRandFieldWithValues(java.lang.String)
*/
@Nullable
@Override
public Entry<String, String> hRandFieldWithValues(String key) {
return convertAndReturn(delegate.hRandFieldWithValues(serialize(key)),
(Converter<Entry<byte[], byte[]>, Entry<String, String>>) this::convertEntry);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#hRandField(java.lang.String, long)
*/
@Nullable
@Override
public List<String> hRandField(String key, long count) {
return convertAndReturn(delegate.hRandField(serialize(key), count), byteListToStringList);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#hRandFieldWithValues(java.lang.String, long)
*/
@Nullable
@Override
public List<Entry<String, String>> hRandFieldWithValues(String key, long count) {
return convertAndReturn(delegate.hRandFieldWithValues(serialize(key), count),
new ListConverter<>(this::convertEntry));
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#hKeys(java.lang.String)
Expand Down Expand Up @@ -2879,6 +2986,78 @@ public Long zInterStore(String destKey, String... sets) {
return zInterStore(serialize(destKey), serializeMulti(sets));
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisZSetCommands#zRandMember(byte[])
*/
@Override
public byte[] zRandMember(byte[] key) {
return delegate.zRandMember(key);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisZSetCommands#zRandMember(byte[], long)
*/
@Override
public List<byte[]> zRandMember(byte[] key, long count) {
return delegate.zRandMember(key, count);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisZSetCommands#zRandMemberWithScore(byte[])
*/
@Override
public Tuple zRandMemberWithScore(byte[] key) {
return delegate.zRandMemberWithScore(key);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.RedisZSetCommands#zRandMemberWithScore(byte[], long)
*/
@Override
public List<Tuple> zRandMemberWithScore(byte[] key, long count) {
return delegate.zRandMemberWithScore(key, count);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#zRandMember(java.lang.String)
*/
@Override
public String zRandMember(String key) {
return convertAndReturn(delegate.zRandMember(serialize(key)), bytesToString);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#zRandMember(java.lang.String, long)
*/
@Override
public List<String> zRandMember(String key, long count) {
return convertAndReturn(delegate.zRandMember(serialize(key), count), byteListToStringList);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#zRandMemberWithScore(java.lang.String)
*/
@Override
public StringTuple zRandMemberWithScore(String key) {
return convertAndReturn(delegate.zRandMemberWithScore(serialize(key)), new TupleConverter());
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#zRandMemberWithScores(java.lang.String, long)
*/
@Override
public List<StringTuple> zRandMemberWithScores(String key, long count) {
return convertAndReturn(delegate.zRandMemberWithScore(serialize(key), count), tupleListToStringTuple);
}

/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.StringRedisConnection#zRange(java.lang.String, long, long)
Expand Down Expand Up @@ -3600,24 +3779,7 @@ public String getClientName() {
@Override
public Cursor<Entry<String, String>> hScan(String key, ScanOptions options) {

return new ConvertingCursor<>(this.delegate.hScan(this.serialize(key), options),
source -> new Entry<String, String>() {

@Override
public String getKey() {
return bytesToString.convert(source.getKey());
}

@Override
public String getValue() {
return bytesToString.convert(source.getValue());
}

@Override
public String setValue(String value) {
throw new UnsupportedOperationException("Cannot set value for entry in cursor");
}
});
return new ConvertingCursor<>(this.delegate.hScan(this.serialize(key), options), this::convertEntry);
}

/*
Expand Down Expand Up @@ -3860,7 +4022,8 @@ public RecordId xAdd(StringRecord record, XAddOptions options) {
*/
@Override
public List<RecordId> xClaimJustId(String key, String group, String consumer, XClaimOptions options) {
return convertAndReturn(delegate.xClaimJustId(serialize(key), group, consumer, options), Converters.identityConverter());
return convertAndReturn(delegate.xClaimJustId(serialize(key), group, consumer, options),
Converters.identityConverter());
}

/*
Expand Down Expand Up @@ -3897,7 +4060,8 @@ public String xGroupCreate(String key, ReadOffset readOffset, String group) {
*/
@Override
public String xGroupCreate(String key, ReadOffset readOffset, String group, boolean mkStream) {
return convertAndReturn(delegate.xGroupCreate(serialize(key), group, readOffset, mkStream), Converters.identityConverter());
return convertAndReturn(delegate.xGroupCreate(serialize(key), group, readOffset, mkStream),
Converters.identityConverter());
}

/*
Expand Down Expand Up @@ -3970,7 +4134,8 @@ public PendingMessagesSummary xPending(String key, String groupName) {
@Override
public PendingMessages xPending(String key, String groupName, String consumer,
org.springframework.data.domain.Range<String> range, Long count) {
return convertAndReturn(delegate.xPending(serialize(key), groupName, consumer, range, count), Converters.identityConverter());
return convertAndReturn(delegate.xPending(serialize(key), groupName, consumer, range, count),
Converters.identityConverter());
}

/*
Expand Down Expand Up @@ -4267,7 +4432,8 @@ private <T> T convertAndReturn(@Nullable Object value, Converter converter) {
}

return value == null ? null
: ObjectUtils.nullSafeEquals(converter, Converters.identityConverter()) ? (T) value : (T) converter.convert(value);
: ObjectUtils.nullSafeEquals(converter, Converters.identityConverter()) ? (T) value
: (T) converter.convert(value);
}

private void addResultConverter(Converter<?, ?> converter) {
Expand Down
Loading