Skip to content

Commit 02ff807

Browse files
denglimingsazzad16
andauthored
Add support for ZRANDMEMBER command (#2448)
* Add support for ZRANDMEMBER command * Fix review * Fix review Co-authored-by: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com>
1 parent e1ad3ba commit 02ff807

18 files changed

+300
-9
lines changed

src/main/java/redis/clients/jedis/BinaryClient.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@
1616
import static redis.clients.jedis.Protocol.Command.UNSUBSCRIBE;
1717
import static redis.clients.jedis.Protocol.Keyword.*;
1818

19-
import java.util.ArrayList;
20-
import java.util.Collections;
21-
import java.util.List;
22-
import java.util.Map;
19+
import java.util.*;
2320
import java.util.Map.Entry;
2421

2522
import javax.net.ssl.HostnameVerifier;
@@ -619,6 +616,18 @@ public void zrevrangeWithScores(final byte[] key, final long start, final long s
619616
sendCommand(ZREVRANGE, key, toByteArray(start), toByteArray(stop), WITHSCORES.getRaw());
620617
}
621618

619+
public void zrandmember(final byte[] key) {
620+
sendCommand(ZRANDMEMBER, key);
621+
}
622+
623+
public void zrandmember(final byte[] key, final long count) {
624+
sendCommand(ZRANDMEMBER, key, toByteArray(count));
625+
}
626+
627+
public void zrandmemberWithScores(final byte[] key, final long count) {
628+
sendCommand(ZRANDMEMBER, key, toByteArray(count), WITHSCORES.getRaw());
629+
}
630+
622631
public void zcard(final byte[] key) {
623632
sendCommand(ZCARD, key);
624633
}

src/main/java/redis/clients/jedis/BinaryJedis.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2123,6 +2123,27 @@ public Set<Tuple> zrevrangeWithScores(final byte[] key, final long start, final
21232123
return getTupledSet();
21242124
}
21252125

2126+
@Override
2127+
public byte[] zrandmember(final byte[] key) {
2128+
checkIsInMultiOrPipeline();
2129+
client.zrandmember(key);
2130+
return client.getBinaryBulkReply();
2131+
}
2132+
2133+
@Override
2134+
public Set<byte[]> zrandmember(final byte[] key, final long count) {
2135+
checkIsInMultiOrPipeline();
2136+
client.zrandmember(key, count);
2137+
return SetFromList.of(client.getBinaryMultiBulkReply());
2138+
}
2139+
2140+
@Override
2141+
public Set<Tuple> zrandmemberWithScores(final byte[] key, final long count) {
2142+
checkIsInMultiOrPipeline();
2143+
client.zrandmemberWithScores(key, count);
2144+
return getTupledSet();
2145+
}
2146+
21262147
/**
21272148
* Return the sorted set cardinality (number of elements). If the key does not exist 0 is
21282149
* returned, like for empty sorted sets.
@@ -2856,6 +2877,10 @@ public Set<Tuple> zrangeByScoreWithScores(final byte[] key, final byte[] min, fi
28562877

28572878
protected Set<Tuple> getTupledSet() {
28582879
List<byte[]> membersWithScores = client.getBinaryMultiBulkReply();
2880+
// If response from Redis nil, we should return null.
2881+
if (membersWithScores == null) {
2882+
return null;
2883+
}
28592884
if (membersWithScores.isEmpty()) {
28602885
return Collections.emptySet();
28612886
}

src/main/java/redis/clients/jedis/BinaryJedisCluster.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,36 @@ public Set<Tuple> execute(Jedis connection) {
10681068
}.runBinary(key);
10691069
}
10701070

1071+
@Override
1072+
public byte[] zrandmember(final byte[] key) {
1073+
return new JedisClusterCommand<byte[]>(connectionHandler, maxAttempts) {
1074+
@Override
1075+
public byte[] execute(Jedis connection) {
1076+
return connection.zrandmember(key);
1077+
}
1078+
}.runBinary(key);
1079+
}
1080+
1081+
@Override
1082+
public Set<byte[]> zrandmember(final byte[] key, final long count) {
1083+
return new JedisClusterCommand<Set<byte[]>>(connectionHandler, maxAttempts) {
1084+
@Override
1085+
public Set<byte[]> execute(Jedis connection) {
1086+
return connection.zrandmember(key, count);
1087+
}
1088+
}.runBinary(key);
1089+
}
1090+
1091+
@Override
1092+
public Set<Tuple> zrandmemberWithScores(final byte[] key, final long count) {
1093+
return new JedisClusterCommand<Set<Tuple>>(connectionHandler, maxAttempts) {
1094+
@Override
1095+
public Set<Tuple> execute(Jedis connection) {
1096+
return connection.zrandmemberWithScores(key, count);
1097+
}
1098+
}.runBinary(key);
1099+
}
1100+
10711101
@Override
10721102
public Long zcard(final byte[] key) {
10731103
return new JedisClusterCommand<Long>(connectionHandler, maxAttempts) {

src/main/java/redis/clients/jedis/BinaryShardedJedis.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,24 @@ public Set<Tuple> zrevrangeWithScores(final byte[] key, final long start, final
613613
return j.zrevrangeWithScores(key, start, stop);
614614
}
615615

616+
@Override
617+
public byte[] zrandmember(final byte[] key) {
618+
Jedis j = getShard(key);
619+
return j.zrandmember(key);
620+
}
621+
622+
@Override
623+
public Set<byte[]> zrandmember(final byte[] key, final long count) {
624+
Jedis j = getShard(key);
625+
return j.zrandmember(key, count);
626+
}
627+
628+
@Override
629+
public Set<Tuple> zrandmemberWithScores(final byte[] key, final long count) {
630+
Jedis j = getShard(key);
631+
return j.zrandmemberWithScores(key, count);
632+
}
633+
616634
@Override
617635
public Long zcard(final byte[] key) {
618636
Jedis j = getShard(key);

src/main/java/redis/clients/jedis/Client.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,21 @@ public void zrevrangeWithScores(final String key, final long start, final long s
535535
zrevrangeWithScores(SafeEncoder.encode(key), start, stop);
536536
}
537537

538+
@Override
539+
public void zrandmember(final String key) {
540+
zrandmember(SafeEncoder.encode(key));
541+
}
542+
543+
@Override
544+
public void zrandmember(final String key, final long count) {
545+
zrandmember(SafeEncoder.encode(key), count);
546+
}
547+
548+
@Override
549+
public void zrandmemberWithScores(final String key, final long count) {
550+
zrandmemberWithScores(SafeEncoder.encode(key), count);
551+
}
552+
538553
@Override
539554
public void zcard(final String key) {
540555
zcard(SafeEncoder.encode(key));

src/main/java/redis/clients/jedis/Jedis.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1800,6 +1800,28 @@ public Set<Tuple> zrevrangeWithScores(final String key, final long start, final
18001800
return getTupledSet();
18011801
}
18021802

1803+
@Override
1804+
public String zrandmember(final String key) {
1805+
checkIsInMultiOrPipeline();
1806+
client.zrandmember(key);
1807+
return client.getBulkReply();
1808+
}
1809+
1810+
@Override
1811+
public Set<String> zrandmember(final String key, final long count) {
1812+
checkIsInMultiOrPipeline();
1813+
client.zrandmember(key, count);
1814+
final List<String> members = client.getMultiBulkReply();
1815+
return members == null ? null : SetFromList.of(members);
1816+
}
1817+
1818+
@Override
1819+
public Set<Tuple> zrandmemberWithScores(final String key, final long count) {
1820+
checkIsInMultiOrPipeline();
1821+
client.zrandmemberWithScores(key, count);
1822+
return getTupledSet();
1823+
}
1824+
18031825
/**
18041826
* Return the sorted set cardinality (number of elements). If the key does not exist 0 is
18051827
* returned, like for empty sorted sets.

src/main/java/redis/clients/jedis/JedisCluster.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,36 @@ public Set<Tuple> execute(Jedis connection) {
11701170
}.run(key);
11711171
}
11721172

1173+
@Override
1174+
public String zrandmember(final String key) {
1175+
return new JedisClusterCommand<String>(connectionHandler, maxAttempts) {
1176+
@Override
1177+
public String execute(Jedis connection) {
1178+
return connection.zrandmember(key);
1179+
}
1180+
}.run(key);
1181+
}
1182+
1183+
@Override
1184+
public Set<String> zrandmember(final String key, final long count) {
1185+
return new JedisClusterCommand<Set<String>>(connectionHandler, maxAttempts) {
1186+
@Override
1187+
public Set<String> execute(Jedis connection) {
1188+
return connection.zrandmember(key, count);
1189+
}
1190+
}.run(key);
1191+
}
1192+
1193+
@Override
1194+
public Set<Tuple> zrandmemberWithScores(final String key, final long count) {
1195+
return new JedisClusterCommand<Set<Tuple>>(connectionHandler, maxAttempts) {
1196+
@Override
1197+
public Set<Tuple> execute(Jedis connection) {
1198+
return connection.zrandmemberWithScores(key, count);
1199+
}
1200+
}.run(key);
1201+
}
1202+
11731203
@Override
11741204
public Long zcard(final String key) {
11751205
return new JedisClusterCommand<Long>(connectionHandler, maxAttempts) {

src/main/java/redis/clients/jedis/PipelineBase.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,42 @@ public Response<Set<Tuple>> zrevrangeWithScores(final byte[] key, final long sta
14441444
return getResponse(BuilderFactory.TUPLE_ZSET);
14451445
}
14461446

1447+
@Override
1448+
public Response<byte[]> zrandmember(final byte[] key) {
1449+
getClient(key).zrandmember(key);
1450+
return getResponse(BuilderFactory.BYTE_ARRAY);
1451+
}
1452+
1453+
@Override
1454+
public Response<Set<byte[]>> zrandmember(final byte[] key, final long count) {
1455+
getClient(key).zrandmember(key, count);
1456+
return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1457+
}
1458+
1459+
@Override
1460+
public Response<Set<Tuple>> zrandmemberWithScores(final byte[] key, final long count) {
1461+
getClient(key).zrandmemberWithScores(key, count);
1462+
return getResponse(BuilderFactory.TUPLE_ZSET);
1463+
}
1464+
1465+
@Override
1466+
public Response<String> zrandmember(final String key) {
1467+
getClient(key).zrandmember(key);
1468+
return getResponse(BuilderFactory.STRING);
1469+
}
1470+
1471+
@Override
1472+
public Response<Set<String>> zrandmember(final String key, final long count) {
1473+
getClient(key).zrandmember(key, count);
1474+
return getResponse(BuilderFactory.STRING_ZSET);
1475+
}
1476+
1477+
@Override
1478+
public Response<Set<Tuple>> zrandmemberWithScores(final String key, final long count) {
1479+
getClient(key).zrandmemberWithScores(key, count);
1480+
return getResponse(BuilderFactory.TUPLE_ZSET);
1481+
}
1482+
14471483
@Override
14481484
public Response<Long> zrevrank(final String key, final String member) {
14491485
getClient(key).zrevrank(key, member);

src/main/java/redis/clients/jedis/Protocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ public static enum Command implements ProtocolCommand {
250250
HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, HRANDFIELD, RPUSH, LPUSH, LLEN, LRANGE, LTRIM,
251251
LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER,
252252
SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM,
253-
ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, ZPOPMAX, ZPOPMIN, MULTI, DISCARD, EXEC,
253+
ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZRANDMEMBER, ZCARD, ZSCORE, ZPOPMAX, ZPOPMIN, MULTI, DISCARD, EXEC,
254254
WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE,
255255
PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK,
256256
ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREVRANGEBYLEX,

src/main/java/redis/clients/jedis/ShardedJedis.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,24 @@ public Set<Tuple> zrevrangeWithScores(final String key, final long start, final
640640
return j.zrevrangeWithScores(key, start, stop);
641641
}
642642

643+
@Override
644+
public String zrandmember(final String key) {
645+
Jedis j = getShard(key);
646+
return j.zrandmember(key);
647+
}
648+
649+
@Override
650+
public Set<String> zrandmember(final String key, final long count) {
651+
Jedis j = getShard(key);
652+
return j.zrandmember(key, count);
653+
}
654+
655+
@Override
656+
public Set<Tuple> zrandmemberWithScores(final String key, final long count) {
657+
Jedis j = getShard(key);
658+
return j.zrandmemberWithScores(key, count);
659+
}
660+
643661
@Override
644662
public Long zcard(final String key) {
645663
Jedis j = getShard(key);

0 commit comments

Comments
 (0)