SRANDMEMBER:随机获取集合中的元素

通过使用 SRANDMEMBER 命令,用户可以从集合中随机地获取指定数量的元素。

SRANDMEMBER 命令接受一个可选的 count 参数,用于指定用户想要获取的元素数量,如果用户没有给定这个参数,那么 SRANDMEMBER 命令默认只获取一个元素:

SRANDMEMBER set [count]

需要注意的一点是,被 SRANDMEMBER 命令返回的元素仍然会存在于集合当中,它们不会被移除。

举个例子,对于包含以下元素的 databases 集合来说:

redis> SMEMBERS databases
1) "Neo4j"
2) "Redis"
3) "PostgreSQL"
4) "CouchDB"
5) "Oracle"
6) "MS SQL"
7) "MongoDB"
8) "MySQL"

我们可以使用 SRANDMEMBER 命令随机地获取集合包含的元素:

redis> SRANDMEMBER databases
"MySQL"
redis> SRANDMEMBER databases
"PostgreSQL"
redis> SRANDMEMBER databases
"Neo4j"
redis> SRANDMEMBER databases
"CouchDB"

再次提醒,SRANDMEMBER 命令不会移除被返回的集合元素,这一点可以通过查看 databases 集合包含的元素来确认:

redis> SMEMBERS databases -- 集合包含的元素和执行SRANDMEMBER之前完全一样
1) "Neo4j"
2) "Redis"
3) "PostgreSQL"
4) "CouchDB"
5) "Oracle"
6) "MS SQL"
7) "MongoDB"
8) "MySQL"

返回指定数量的元素

通过可选的 count 参数,用户可以指定 SRANDMEMBER 命令返回的元素数量,其中 count 参数的值既可以是正数也可以是负数。

如果 count 参数的值为正数,那么 SRANDMEMBER 命令将返回 count 个不重复的元素:

redis> SRANDMEMBER databases 2 -- 随机地返回2个不重复的元素
1) "MySQL"
2) "Oracle"
redis> SRANDMEMBER databases 3 -- 随机地返回3个不重复的元素
1) "PostgreSQL"
2) "Oracle"
3) "MS SQL"

当 count 参数的值大于集合包含的元素数量时,SRANDMEMBER 命令将返回集合包含的所有元素:

redis> SRANDMEMBER databases 10
1) "Neo4j" -- 因为databases集合的元素数量少于10个
2) "Redis" -- 所以命令会返回集合包含的全部8个元素
3) "PostgreSQL"
4) "CouchDB"
5) "Oracle"
6) "MongoDB"
7) "MS SQL"
8) "MySQL"

如果 count 参数的值为负数,那么 SRANDMEMBER 命令将随机返回 abs(count)个元素(abs(count)也即是 count 的绝对值),并且在这些元素当中允许出现重复的元素:

redis> SRANDMEMBER databases -3 -- 随机地返回3个可能会重复的元素
1) "Neo4j"
2) "CouchDB"
3) "MongoDB"
redis> SRANDMEMBER databases -5 -- 随机地返回5个可能会重复的元素
1) "Neo4j"
2) "MySQL" -- 出现了2个"MySQL"元素
3) "MySQL"
4) "CouchDB"
5) "Oracle"

因为 count 参数为负数的 SRANDMEMBER 命令允许返回重复元素,所以即使 abs(count)的值大于集合包含的元素数量,SRANDMEMBER 命令也会按照要求返回 abs(count)个元素:

redis> SRANDMEMBER databases -10 -- 随机地返回10个可能相同的元素
1) "Redis"
2) "MySQL"
3) "CouchDB"
4) "PostgreSQL"
5) "Neo4j"
6) "MS SQL"
7) "MS SQL"
8) "MySQL"
9) "Neo4j"
10) "Redis"

其它信息

  • 复杂度:O(N),其中 N 为被返回的元素数量。

  • 版本要求:不带 count 参数的 SRANDMEMBER 命令从 Redis 1.0.0 版本开始可用;带有 count 参数的 SRANDMEMBER 命令从 Redis 2.6.0 版本开始可用。