1. SRANDMEMBER key [count]
起始版本:1.0.0
时间复杂度:只提供 key 参数时为 O(1) 。 如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数。
如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。 该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
1.1. 返回值
只提供 key 参数时,返回一个元素;如果集合为空,返回 nil 。
如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。
1.2. demo
# key 不存在, 不传count参数, 返回 nil;传count参数,返回空list
127.0.0.1:6379> EXISTS myset
(integer) 0
127.0.0.1:6379> SRANDMEMBER myset
(nil)
127.0.0.1:6379> SRANDMEMBER myset 1
(empty list or set)
127.0.0.1:6379> SMEMBERS myset
1) "d"
2) "b"
3) "c"
4) "a"
5) "e"
# 不传count,默认为1, 随机返回一个元素
127.0.0.1:6379> SRANDMEMBER myset
"a"
127.0.0.1:6379> SRANDMEMBER myset
"c"
# 传count, 随机返回count个元素
127.0.0.1:6379> SRANDMEMBER myset 2
1) "c"
2) "e"
# count > 元素数量, 返回整个set
127.0.0.1:6379> SRANDMEMBER myset 10
1) "d"
2) "b"
3) "c"
4) "a"
5) "e"
# count 为负数, 随机返回 count绝对值个元素
127.0.0.1:6379> SRANDMEMBER myset -1
1) "b"
127.0.0.1:6379> SRANDMEMBER myset -4
1) "c"
2) "a"
3) "a"
4) "e"
# count为负数, 且绝对值大于元素数量, 返回 count 绝对值个元素, 元素可能会重复多次
127.0.0.1:6379> SRANDMEMBER myset -6
1) "b"
2) "e"
3) "e"
4) "b"
5) "a"
6) "c"
# 如果指定的key不是set类型,返回错误
127.0.0.1:6379> type key1
string
127.0.0.1:6379> SRANDMEMBER key1
(error) WRONGTYPE Operation against a key holding the wrong kind of value