diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveHashCommands.java b/src/main/java/org/springframework/data/redis/connection/ReactiveHashCommands.java index 267585d33..6d277f20e 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveHashCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveHashCommands.java @@ -582,10 +582,11 @@ public interface ReactiveHashCommands { /** * Use a {@link Flux} to iterate over entries in the hash at {@code key}. The resulting {@link Flux} acts as a cursor - * and issues {@code HSCAN} commands itself as long as the subscriber signals demand . + * and issues {@code HSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @return + * @return the {@link Flux} emitting {@link java.util.Map.Entry entries} one by one. + * @throws IllegalArgumentException in case the given key is {@literal null}. * @see Redis Documentation: HSCAN * @since 2.1 */ @@ -598,12 +599,14 @@ public interface ReactiveHashCommands { * {@link Flux} acts as a cursor and issues {@code HSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @param options must not be {@literal null}. - * @return + * @param options must not be {@literal null}. Use {@link ScanOptions#NONE} instead. + * @return the {@link Flux} emitting the raw {@link java.util.Map.Entry entries} one by one. + * @throws IllegalArgumentException in case one of the required arguments is {@literal null}. * @see Redis Documentation: HSCAN * @since 2.1 */ default Flux> hScan(ByteBuffer key, ScanOptions options) { + return hScan(Mono.just(KeyScanCommand.key(key).withOptions(options))).map(CommandResponse::getOutput) .flatMap(it -> it); } @@ -613,7 +616,7 @@ public interface ReactiveHashCommands { * and issues {@code HSCAN} commands itself as long as the subscriber signals demand. * * @param commands must not be {@literal null}. - * @return + * @return the {@link Flux} emitting {@link CommandResponse} one by one. * @see Redis Documentation: HSCAN * @since 2.1 */ diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveKeyCommands.java b/src/main/java/org/springframework/data/redis/connection/ReactiveKeyCommands.java index a69fa0f8e..7ec4a9549 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveKeyCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveKeyCommands.java @@ -112,7 +112,9 @@ public interface ReactiveKeyCommands { Flux, Long>> touch(Publisher> keys); /** - * Find all keys matching the given {@literal pattern}. + * Find all keys matching the given {@literal pattern}.
+ * It is recommended to use {@link #scan(ScanOptions)} to iterate over the keyspace as {@link #keys(ByteBuffer)} is a + * non-interruptible and expensive Redis operation. * * @param pattern must not be {@literal null}. * @return @@ -126,8 +128,10 @@ public interface ReactiveKeyCommands { } /** - * Find all keys matching the given {@literal pattern}. - * + * Find all keys matching the given {@literal pattern}.
+ * It is recommended to use {@link #scan(ScanOptions)} to iterate over the keyspace as {@link #keys(Publisher)} is a + * non-interruptible and expensive Redis operation. + * * @param patterns must not be {@literal null}. * @return * @see Redis Documentation: KEYS @@ -151,7 +155,8 @@ public interface ReactiveKeyCommands { * commands itself as long as the subscriber signals demand. * * @param options must not be {@literal null}. - * @return never {@literal null}. + * @return the {@link Flux} emitting {@link ByteBuffer keys} one by one. + * @throws IllegalArgumentException when options is {@literal null}. * @see Redis Documentation: SCAN * @since 2.1 */ diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/ReactiveRedisConnection.java index eeb275950..5c6e28efc 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveRedisConnection.java @@ -211,14 +211,16 @@ public interface ReactiveRedisConnection extends Closeable { } /** - * {@link Command} for key-bound scan operations like {@code HSCAN}, {@code SSCAN}, and {@code ZSCAN}, . + * {@link Command} for key-bound scan operations like {@code SCAN}, {@code HSCAN}, {@code SSCAN} and {@code + * ZSCAN}. * * @author Mark Paluch + * @author Christoph Strobl * @since 2.1 */ class KeyScanCommand extends KeyCommand { - private ScanOptions options; + private final ScanOptions options; private KeyScanCommand(@Nullable ByteBuffer key, ScanOptions options) { @@ -248,6 +250,11 @@ public interface ReactiveRedisConnection extends Closeable { return new KeyScanCommand(getKey(), options); } + /** + * Get the {@link ScanOptions} to apply. + * + * @return never {@literal null}. + */ public ScanOptions getOptions() { return options; } diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveSetCommands.java b/src/main/java/org/springframework/data/redis/connection/ReactiveSetCommands.java index bfc982c30..2e90ef49e 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveSetCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveSetCommands.java @@ -1020,7 +1020,8 @@ public interface ReactiveSetCommands { * and issues {@code SSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @return + * @return the {@link Flux} emitting the raw {@link ByteBuffer members} one by one. + * @throws IllegalArgumentException when options is {@literal null}. * @see Redis Documentation: SSCAN * @since 2.1 */ @@ -1033,12 +1034,14 @@ public interface ReactiveSetCommands { * {@link Flux} acts as a cursor and issues {@code SSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @param options must not be {@literal null}. - * @return + * @param options must not be {@literal null}. Use {@link ScanOptions#NONE} instead. + * @return the {@link Flux} emitting the raw {@link ByteBuffer members} one by one. + * @throws IllegalArgumentException when one of the required arguments is {@literal null}. * @see Redis Documentation: SSCAN * @since 2.1 */ default Flux sScan(ByteBuffer key, ScanOptions options) { + return sScan(Mono.just(KeyScanCommand.key(key).withOptions(options))).map(CommandResponse::getOutput) .flatMap(it -> it); } diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveZSetCommands.java b/src/main/java/org/springframework/data/redis/connection/ReactiveZSetCommands.java index 8f2a5768b..4bf7a97ce 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveZSetCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveZSetCommands.java @@ -1004,7 +1004,8 @@ public interface ReactiveZSetCommands { * cursor and issues {@code ZSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @return + * @return the {@link Flux} emitting the raw {@link Tuple tuples} one by one. + * @throws IllegalArgumentException when key is {@literal null}. * @see Redis Documentation: ZSCAN * @since 2.1 */ @@ -1017,12 +1018,14 @@ public interface ReactiveZSetCommands { * resulting {@link Flux} acts as a cursor and issues {@code ZSCAN} commands itself as long as the subscriber signals. * * @param key must not be {@literal null}. - * @param options must not be {@literal null}. - * @return + * @param options must not be {@literal null}. Use {@link ScanOptions#NONE} instead. + * @return the {@link Flux} emitting the raw {@link Tuple tuples} one by one. + * @throws IllegalArgumentException when one of the required arguments is {@literal null}. * @see Redis Documentation: ZSCAN * @since 2.1 */ default Flux zScan(ByteBuffer key, ScanOptions options) { + return zScan(Mono.just(KeyScanCommand.key(key).withOptions(options))).map(CommandResponse::getOutput) .flatMap(it -> it); } diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveHashCommands.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveHashCommands.java index dd98592aa..fcaed56e3 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveHashCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveHashCommands.java @@ -75,8 +75,7 @@ class LettuceReactiveHashCommands implements ReactiveHashCommands { Entry entry = command.getFieldValueMap().entrySet().iterator().next(); - result = command.isUpsert() - ? cmd.hset(command.getKey(), entry.getKey(), entry.getValue()) + result = command.isUpsert() ? cmd.hset(command.getKey(), entry.getKey(), entry.getValue()) : cmd.hsetnx(command.getKey(), entry.getKey(), entry.getValue()); } else { @@ -246,7 +245,7 @@ class LettuceReactiveHashCommands implements ReactiveHashCommands { @Override public ByteBuffer setValue(ByteBuffer value) { - throw new UnsupportedOperationException("Cannot set value for entry in cursor"); + throw new UnsupportedOperationException("Cannot set value for entry in cursor."); } }); diff --git a/src/main/java/org/springframework/data/redis/core/DefaultReactiveHashOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultReactiveHashOperations.java index 1d1e820fa..63b6244e1 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultReactiveHashOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultReactiveHashOperations.java @@ -46,7 +46,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations private final @NonNull ReactiveRedisTemplate template; private final @NonNull RedisSerializationContext serializationContext; - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#delete(java.lang.Object, java.lang.Object[]) */ @Override @@ -64,7 +65,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .flatMap(hks -> connection.hDel(rawKey(key), hks))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#hasKey(java.lang.Object, java.lang.Object) */ @Override @@ -77,7 +79,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations return createMono(connection -> connection.hExists(rawKey(key), rawHashKey((HK) hashKey))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#get(java.lang.Object, java.lang.Object) */ @Override @@ -90,7 +93,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations return createMono(connection -> connection.hGet(rawKey(key), rawHashKey((HK) hashKey)).map(this::readHashValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#multiGet(java.lang.Object, java.util.Collection) */ @Override @@ -106,7 +110,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .flatMap(hks -> connection.hMGet(rawKey(key), hks)).map(this::deserializeHashValues)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#increment(java.lang.Object, java.lang.Object, long) */ @Override @@ -120,7 +125,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .hIncrBy(rawKey(key), rawHashKey(hashKey), delta)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#increment(java.lang.Object, java.lang.Object, double) */ @Override @@ -134,7 +140,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .hIncrBy(rawKey(key), rawHashKey(hashKey), delta)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#keys(java.lang.Object) */ @Override @@ -146,7 +153,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .map(this::readHashKey)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#size(java.lang.Object) */ @Override @@ -157,7 +165,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations return createMono(connection -> connection.hLen(rawKey(key))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#putAll(java.lang.Object, java.util.Map) */ @Override @@ -171,7 +180,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .flatMap(serialized -> connection.hMSet(rawKey(key), serialized))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#put(java.lang.Object, java.lang.Object, java.lang.Object) */ @Override @@ -184,7 +194,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations return createMono(connection -> connection.hSet(rawKey(key), rawHashKey(hashKey), rawHashValue(value))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#putIfAbsent(java.lang.Object, java.lang.Object, java.lang.Object) */ @Override @@ -197,7 +208,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations return createMono(connection -> connection.hSetNX(rawKey(key), rawHashKey(hashKey), rawHashValue(value))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#values(java.lang.Object) */ @Override @@ -209,7 +221,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .map(this::readHashValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#entries(java.lang.Object) */ @Override @@ -221,7 +234,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .map(this::deserializeHashEntry)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#scan(java.lang.Object, org.springframework.data.redis.core.ScanOptions) */ @Override @@ -234,7 +248,8 @@ class DefaultReactiveHashOperations implements ReactiveHashOperations .map(this::deserializeHashEntry)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveHashOperations#delete(java.lang.Object) */ @Override diff --git a/src/main/java/org/springframework/data/redis/core/DefaultReactiveSetOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultReactiveSetOperations.java index f92f97e76..6f34e2ba3 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultReactiveSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultReactiveSetOperations.java @@ -45,7 +45,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations private final @NonNull ReactiveRedisTemplate template; private final @NonNull RedisSerializationContext serializationContext; - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#add(java.lang.Object, java.lang.Object[]) */ @Override @@ -63,7 +64,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations .flatMap(serialized -> connection.sAdd(rawKey(key), serialized))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#remove(java.lang.Object, java.lang.Object[]) */ @Override @@ -82,7 +84,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations .flatMap(serialized -> connection.sRem(rawKey(key), serialized))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#pop(java.lang.Object) */ @Override @@ -105,7 +108,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createFlux(connection -> connection.sPop(rawKey(key), count).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#move(java.lang.Object, java.lang.Object, java.lang.Object) */ @Override @@ -117,7 +121,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createMono(connection -> connection.sMove(rawKey(sourceKey), rawKey(destKey), rawValue(value))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#size(java.lang.Object) */ @Override @@ -128,7 +133,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createMono(connection -> connection.sCard(rawKey(key))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#isMember(java.lang.Object, java.lang.Object) */ @Override @@ -140,7 +146,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createMono(connection -> connection.sIsMember(rawKey(key), rawValue((V) o))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#intersect(java.lang.Object, java.lang.Object) */ @Override @@ -152,7 +159,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return intersect(key, Collections.singleton(otherKey)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#intersect(java.lang.Object, java.util.Collection) */ @Override @@ -181,7 +189,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return intersectAndStore(key, Collections.singleton(otherKey), destKey); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#intersectAndStore(java.lang.Object, java.util.Collection, java.lang.Object) */ @Override @@ -197,7 +206,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations .flatMap(rawKeys -> connection.sInterStore(rawKey(destKey), rawKeys))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#union(java.lang.Object, java.lang.Object) */ @Override @@ -209,7 +219,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return union(key, Collections.singleton(otherKey)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#union(java.lang.Object, java.util.Collection) */ @Override @@ -225,7 +236,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations .map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#unionAndStore(java.lang.Object, java.lang.Object, java.lang.Object) */ @Override @@ -238,7 +250,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return unionAndStore(key, Collections.singleton(otherKey), destKey); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#unionAndStore(java.lang.Object, java.util.Collection, java.lang.Object) */ @Override @@ -254,7 +267,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations .flatMap(rawKeys -> connection.sUnionStore(rawKey(destKey), rawKeys))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#difference(java.lang.Object, java.lang.Object) */ @Override @@ -266,7 +280,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return difference(key, Collections.singleton(otherKey)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#difference(java.lang.Object, java.util.Collection) */ @Override @@ -282,7 +297,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations .map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#differenceAndStore(java.lang.Object, java.lang.Object, java.lang.Object) */ @Override @@ -295,7 +311,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return differenceAndStore(key, Collections.singleton(otherKey), destKey); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#differenceAndStore(java.lang.Object, java.util.Collection, java.lang.Object) */ @Override @@ -311,7 +328,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations .flatMap(rawKeys -> connection.sDiffStore(rawKey(destKey), rawKeys))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#members(java.lang.Object) */ @Override @@ -322,7 +340,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createFlux(connection -> connection.sMembers(rawKey(key)).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#scan(java.lang.Object, org.springframework.data.redis.core.ScanOptions) */ @Override @@ -334,7 +353,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createFlux(connection -> connection.sScan(rawKey(key)).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#randomMember(java.lang.Object) */ @Override @@ -345,7 +365,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createMono(connection -> connection.sRandMember(rawKey(key)).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#distinctRandomMembers(java.lang.Object, long) */ @Override @@ -356,7 +377,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createFlux(connection -> connection.sRandMember(rawKey(key), count).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#randomMembers(java.lang.Object, long) */ @Override @@ -367,7 +389,8 @@ class DefaultReactiveSetOperations implements ReactiveSetOperations return createFlux(connection -> connection.sRandMember(rawKey(key), -count).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveSetOperations#delete(java.lang.Object) */ @Override diff --git a/src/main/java/org/springframework/data/redis/core/DefaultReactiveZSetOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultReactiveZSetOperations.java index e7ae40882..1b9068d71 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultReactiveZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultReactiveZSetOperations.java @@ -53,7 +53,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations template; private final @NonNull RedisSerializationContext serializationContext; - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#add(java.lang.Object, java.lang.Object, double) */ @Override @@ -64,7 +65,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zAdd(rawKey(key), score, rawValue(value)).map(l -> l != 0)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#add(java.lang.Object, java.util.Collection) */ @Override @@ -79,7 +81,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zAdd(rawKey(key), serialized))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#remove(java.lang.Object, java.lang.Object[]) */ @Override @@ -99,7 +102,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRem(rawKey(key), serialized))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#incrementScore(java.lang.Object, java.lang.Object, double) */ @Override @@ -110,7 +114,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zIncrBy(rawKey(key), delta, rawValue(value))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#rank(java.lang.Object, java.lang.Object) */ @Override @@ -122,7 +127,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRank(rawKey(key), rawValue((V) o))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRank(java.lang.Object, java.lang.Object) */ @Override @@ -134,7 +140,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRank(rawKey(key), rawValue((V) o))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#range(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -146,7 +153,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRange(rawKey(key), range).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#rangeWithScores(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -158,7 +166,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRangeWithScores(rawKey(key), range).map(this::readTypedTuple)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#rangeByScore(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -170,7 +179,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRangeByScore(rawKey(key), range).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#rangeByScoreWithScores(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -182,7 +192,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRangeByScoreWithScores(rawKey(key), range).map(this::readTypedTuple)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#rangeByScore(java.lang.Object, org.springframework.data.domain.Range, org.springframework.data.redis.connection.RedisZSetCommands.Limit) */ @Override @@ -194,7 +205,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRangeByScore(rawKey(key), range, limit).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#rangeByScoreWithScores(java.lang.Object, org.springframework.data.domain.Range, org.springframework.data.redis.connection.RedisZSetCommands.Limit) */ @Override @@ -208,7 +220,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRangeByScoreWithScores(rawKey(key), range, limit).map(this::readTypedTuple)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRange(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -220,7 +233,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRange(rawKey(key), range).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRangeWithScores(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -232,7 +246,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRangeWithScores(rawKey(key), range).map(this::readTypedTuple)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRangeByScore(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -244,7 +259,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRangeByScore(rawKey(key), range).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRangeByScoreWithScores(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -257,7 +273,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRangeByScoreWithScores(rawKey(key), range).map(this::readTypedTuple)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRangeByScore(java.lang.Object, org.springframework.data.domain.Range, org.springframework.data.redis.connection.RedisZSetCommands.Limit) */ @Override @@ -269,7 +286,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRangeByScore(rawKey(key), range, limit).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRangeByScoreWithScores(java.lang.Object, org.springframework.data.domain.Range, org.springframework.data.redis.connection.RedisZSetCommands.Limit) */ @Override @@ -283,7 +301,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRangeByScoreWithScores(rawKey(key), range, limit).map(this::readTypedTuple)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#scan(java.lang.Object, org.springframework.data.redis.core.ScanOptions) */ @Override @@ -295,7 +314,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zScan(rawKey(key), options).map(this::readTypedTuple)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#count(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -307,7 +327,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zCount(rawKey(key), range)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#size(java.lang.Object) */ @Override @@ -318,7 +339,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zCard(rawKey(key))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#score(java.lang.Object, java.lang.Object) */ @Override @@ -330,7 +352,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zScore(rawKey(key), rawValue((V) o))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#removeRange(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -342,7 +365,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRemRangeByRank(rawKey(key), range)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#removeRangeByScore(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -454,7 +478,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zInterStore(rawKey(destKey), serialized, weights, aggregate))); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#rangeByLex(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -466,7 +491,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRangeByLex(rawKey(key), range).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#rangeByLex(java.lang.Object, org.springframework.data.domain.Range, org.springframework.data.redis.connection.RedisZSetCommands.Limit) */ @Override @@ -479,7 +505,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRangeByLex(rawKey(key), range, limit).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRangeByLex(java.lang.Object, org.springframework.data.domain.Range) */ @Override @@ -491,7 +518,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRangeByLex(rawKey(key), range).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#reverseRangeByLex(java.lang.Object, org.springframework.data.domain.Range, org.springframework.data.redis.connection.RedisZSetCommands.Limit) */ @Override @@ -504,7 +532,8 @@ class DefaultReactiveZSetOperations implements ReactiveZSetOperations connection.zRevRangeByLex(rawKey(key), range, limit).map(this::readValue)); } - /* (non-Javadoc) + /* + * (non-Javadoc) * @see org.springframework.data.redis.core.ReactiveZSetOperations#delete(java.lang.Object) */ @Override diff --git a/src/main/java/org/springframework/data/redis/core/ReactiveHashOperations.java b/src/main/java/org/springframework/data/redis/core/ReactiveHashOperations.java index b3cd3df50..a0f57d5b6 100644 --- a/src/main/java/org/springframework/data/redis/core/ReactiveHashOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ReactiveHashOperations.java @@ -147,11 +147,13 @@ public interface ReactiveHashOperations { Flux> entries(H key); /** - * Use a {@link Flux} to iterate over entries in the hash at {@code key} given {@link ScanOptions}. The resulting - * {@link Flux} acts as a cursor and issues {@code HSCAN} commands itself as long as the subscriber signals demand. + * Use a {@link Flux} to iterate over entries in the hash at {@code key}. The resulting {@link Flux} acts as a cursor + * and issues {@code HSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @return never {@literal null}. + * @return the {@link Flux} emitting the {@link java.util.Map.Entry entries} on by one or an {@link Flux#empty() empty + * flux} if the key does not exist. + * @throws IllegalArgumentException when the given {@code key} is {@literal null}. * @see Redis Documentation: HSCAN * @since 2.1 */ @@ -164,8 +166,10 @@ public interface ReactiveHashOperations { * {@link Flux} acts as a cursor and issues {@code HSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @param options must not be {@literal null}. - * @return never {@literal null}. + * @param options must not be {@literal null}. Use {@link ScanOptions#NONE} instead. + * @return the {@link Flux} emitting the {@link java.util.Map.Entry entries} on by one or an {@link Flux#empty() empty + * flux} if the key does not exist. + * @throws IllegalArgumentException when one of the required arguments is {@literal null}. * @see Redis Documentation: HSCAN * @since 2.1 */ diff --git a/src/main/java/org/springframework/data/redis/core/ReactiveRedisOperations.java b/src/main/java/org/springframework/data/redis/core/ReactiveRedisOperations.java index ab8c97702..4d407bc8b 100644 --- a/src/main/java/org/springframework/data/redis/core/ReactiveRedisOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ReactiveRedisOperations.java @@ -138,22 +138,24 @@ public interface ReactiveRedisOperations { Mono type(K key); /** - * Find all keys matching the given {@code pattern}. + * Find all keys matching the given {@code pattern}.
+ * IMPORTANT: It is recommended to use {@link #scan()} to iterate over the keyspace as + * {@link #keys(Object)} is a + * non-interruptible and expensive Redis operation. * * @param pattern must not be {@literal null}. - * @return + * @return the {@link Flux} emitting matching keys one by one. + * @throws IllegalArgumentException in case the pattern is {@literal null}. * @see Redis Documentation: KEYS - * @deprecated Since 2.1. Use {@link #scan()} to iterate over the keyspace as {@link #keys(Object)} is a - * non-interruptible and expensive Redis operation. */ - @Deprecated Flux keys(K pattern); /** * Use a {@link Flux} to iterate over keys. The resulting {@link Flux} acts as a cursor and issues {@code SCAN} * commands itself as long as the subscriber signals demand. * - * @return never {@literal null}. + * @return the {@link Flux} emitting the {@literal keys} one by one or an {@link Flux#empty() empty flux} if none + * exist. * @see Redis Documentation: SCAN * @since 2.1 */ @@ -165,8 +167,10 @@ public interface ReactiveRedisOperations { * Use a {@link Flux} to iterate over keys. The resulting {@link Flux} acts as a cursor and issues {@code SCAN} * commands itself as long as the subscriber signals demand. * - * @param options must not be {@literal null}. - * @return never {@literal null}. + * @param options must not be {@literal null}. Use {@link ScanOptions#NONE} instead. + * @return the {@link Flux} emitting the {@literal keys} one by one or an {@link Flux#empty() empty flux} if none + * exist. + * @throws IllegalArgumentException when the given {@code options} is {@literal null}. * @see Redis Documentation: SCAN * @since 2.1 */ diff --git a/src/main/java/org/springframework/data/redis/core/ReactiveSetOperations.java b/src/main/java/org/springframework/data/redis/core/ReactiveSetOperations.java index 8ab9d5923..f9864e04c 100644 --- a/src/main/java/org/springframework/data/redis/core/ReactiveSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ReactiveSetOperations.java @@ -235,11 +235,13 @@ public interface ReactiveSetOperations { Flux members(K key); /** - * Use a {@link Flux} to iterate over entries in the set at {@code key} given {@link ScanOptions}. The resulting - * {@link Flux} acts as a cursor and issues {@code SSCAN} commands itself as long as the subscriber signals demand. + * Use a {@link Flux} to iterate over entries in the set at {@code key}. The resulting {@link Flux} acts as a cursor + * and issues {@code SSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @return never {@literal null}. + * @return the {@link Flux} emitting the {@literal values} one by one or an {@link Flux#empty() empty Flux} if none + * exist. + * @throws IllegalArgumentException when given {@code key} is {@literal null}. * @see Redis Documentation: SSCAN * @since 2.1 */ @@ -252,8 +254,10 @@ public interface ReactiveSetOperations { * {@link Flux} acts as a cursor and issues {@code SSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @param options must not be {@literal null}. - * @return never {@literal null}. + * @param options must not be {@literal null}. Use {@link ScanOptions#NONE} instead. + * @return the {@link Flux} emitting the {@literal values} one by one or an {@link Flux#empty() empty Flux} if the key + * does not exist. + * @throws IllegalArgumentException when one of the required arguments is {@literal null}. * @see Redis Documentation: SSCAN * @since 2.1 */ diff --git a/src/main/java/org/springframework/data/redis/core/ReactiveZSetOperations.java b/src/main/java/org/springframework/data/redis/core/ReactiveZSetOperations.java index 33092e4df..0af3d4201 100644 --- a/src/main/java/org/springframework/data/redis/core/ReactiveZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ReactiveZSetOperations.java @@ -229,12 +229,13 @@ public interface ReactiveZSetOperations { Flux> reverseRangeByScoreWithScores(K key, Range range, Limit limit); /** - * Use a {@link Flux} to iterate over entries in the sorted set at {@code key} given {@link ScanOptions}. The - * resulting {@link Flux} acts as a cursor and issues {@code ZSCAN} commands itself as long as the subscriber signals - * demand. + * Use a {@link Flux} to iterate over entries in the sorted set at {@code key}. The resulting {@link Flux} acts as a + * cursor and issues {@code ZSCAN} commands itself as long as the subscriber signals demand. * * @param key must not be {@literal null}. - * @return never {@literal null}. + * @return the {@link Flux} emitting the {@literal values} one by one or an {@link Flux#empty() empty Flux} if none + * exist. + * @throws IllegalArgumentException when given {@code key} is {@literal null}. * @see Redis Documentation: ZSCAN * @since 2.1 */ @@ -248,8 +249,10 @@ public interface ReactiveZSetOperations { * demand. * * @param key must not be {@literal null}. - * @param options must not be {@literal null}. - * @return never {@literal null}. + * @param options must not be {@literal null}. Use {@link ScanOptions#NONE} instead. + * @return the {@link Flux} emitting the {@literal values} one by one or an {@link Flux#empty() empty Flux} if none + * exist. + * @throws IllegalArgumentException when one of the required arguments is {@literal null}. * @see Redis Documentation: ZSCAN * @since 2.1 */