diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index f7b869ce3..63872f345 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -182,6 +182,26 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc return commandExecutor.writeAsync(getName(), codec, RedisCommands.BZPOPMAX_VALUE, getName(), toSeconds(timeout, unit)); } + @Override + public V random() { + return get(randomAsync()); + } + + @Override + public Collection random(int count) { + return get(randomAsync(count)); + } + + @Override + public RFuture randomAsync() { + return commandExecutor.writeAsync(getName(), codec, RedisCommands.ZRANDMEMBER_SINGLE, getName()); + } + + @Override + public RFuture> randomAsync(int count) { + return commandExecutor.writeAsync(getName(), codec, RedisCommands.ZRANDMEMBER, getName(), count); + } + @Override public boolean add(double score, V object) { return get(addAsync(score, object)); diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index 1d574e5bd..fa6c47437 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -204,6 +204,21 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< */ Double lastScore(); + /** + * Returns random element from this sorted set + * + * @return random element + */ + V random(); + + /** + * Returns random elements from this sorted set limited by count + * + * @param count - values amount to return + * @return random elements + */ + Collection random(int count); + /** * Adds all elements contained in the specified map to this sorted set. * Map contains of score mapped by object. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java index 283f6a1b0..b89e43ca8 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -165,6 +165,21 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn */ RFuture lastScoreAsync(); + /** + * Returns random element from this sorted set + * + * @return value + */ + RFuture randomAsync(); + + /** + * Returns random elements from this sorted set limited by count + * + * @param count - values amount to return + * @return value + */ + RFuture> randomAsync(int count); + /** * Adds all elements contained in the specified map to this sorted set. * Map contains of score mapped by object. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java index f6fff0a77..f3bba63a2 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java @@ -21,6 +21,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import io.reactivex.rxjava3.core.Maybe; +import io.reactivex.rxjava3.core.Single; import org.redisson.api.RScoredSortedSet.Aggregate; import org.redisson.client.protocol.ScoredEntry; @@ -154,7 +156,22 @@ public interface RScoredSortedSetReactive extends RExpirableReactive, RSortab * @return the tail element or {@code null} if this sorted set is empty */ Mono lastScore(); - + + /** + * Returns random element from this sorted set + * + * @return random element + */ + Mono random(); + + /** + * Returns random elements from this sorted set limited by count + * + * @param count - values amount to return + * @return random elements + */ + Mono> random(int count); + /** * Returns an iterator over elements in this set. * If pattern is not null then only elements match this pattern are loaded. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java index 3196aca50..12ef77786 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java @@ -155,7 +155,22 @@ public interface RScoredSortedSetRx extends RExpirableRx, RSortableRx> * @return the tail element or {@code null} if this sorted set is empty */ Maybe lastScore(); - + + /** + * Returns random element from this sorted set + * + * @return random element + */ + Maybe random(); + + /** + * Returns random elements from this sorted set limited by count + * + * @param count - values amount to return + * @return random elements + */ + Single> random(int count); + /** * Returns an iterator over elements in this set. * If pattern is not null then only elements match this pattern are loaded. diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index ae69efe1c..8f7211bb2 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -95,6 +95,8 @@ public interface RedisCommands { RedisStrictCommand ASKING = new RedisStrictCommand("ASKING", new VoidReplayConvertor()); RedisStrictCommand READONLY = new RedisStrictCommand("READONLY", new VoidReplayConvertor()); + RedisCommand> ZRANDMEMBER = new RedisCommand<>("ZRANDMEMBER", new ObjectSetReplayDecoder<>()); + RedisCommand ZRANDMEMBER_SINGLE = new RedisCommand<>("ZRANDMEMBER"); RedisStrictCommand> ZDIFF = new RedisStrictCommand<>("ZDIFF", new ObjectListReplayDecoder<>()); RedisCommand> ZUNION = new RedisCommand<>("ZUNION", new ObjectListReplayDecoder<>()); RedisCommand> ZINTER = new RedisCommand<>("ZINTER", new ObjectListReplayDecoder<>()); diff --git a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java index 5b7bc6aca..ab40121b6 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -31,6 +31,17 @@ import org.redisson.config.Config; public class RedissonScoredSortedSetTest extends BaseTest { + @Test + public void testRandom() { + RScoredSortedSet set = redisson.getScoredSortedSet("test"); + set.add(1, 10); + set.add(2, 20); + set.add(3, 30); + + assertThat(set.random()).isIn(10, 20, 30); + assertThat(set.random(2)).containsAnyOf(10, 20, 30).hasSize(2); + } + @Test public void testTakeFirst() { Assume.assumeTrue(RedisRunner.getDefaultRedisServerInstance().getRedisVersion().compareTo("5.0.0") > 0);