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

通过使用 SRANDMEMBER 命令,用户可以从集合里面随机地获取指定数量的元素。SRANDMEMBER 命令接受一个可选的 count 参数,用于指定用户想要获取的元素数量,如果用户没有给定这个参数,那么 SRANDMEMBER 命令默认只获取一个元素:

  1. SRANDMEMBER set [count]

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

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

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

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

  1. redis> SRANDMEMBER databases
  2. "MySQL"
  3.  
  4. redis> SRANDMEMBER databases
  5. "PostgreSQL"
  6.  
  7. redis> SRANDMEMBER databases
  8. "Neo4j"
  9.  
  10. redis> SRANDMEMBER databases
  11. "CouchDB"

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

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

返回指定数量的元素

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

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

  1. redis> SRANDMEMBER databases 2 -- 随机地返回两个不重复的元素
  2. 1) "MySQL"
  3. 2) "Oracle"
  4.  
  5. redis> SRANDMEMBER databases 3 -- 随机地返回三个不重复的元素
  6. 1) "PostgreSQL"
  7. 2) "Oracle"
  8. 3) "MS SQL"

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

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

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

  1. redis> SRANDMEMBER databases -3 -- 随机地返回三个可能会重复的元素
  2. 1) "Neo4j"
  3. 2) "CouchDB"
  4. 3) "MongoDB"
  5.  
  6. redis> SRANDMEMBER databases -5 -- 随机地返回五个可能会重复的元素
  7. 1) "Neo4j"
  8. 2) "MySQL" -- 出现了两个 "MySQL" 元素
  9. 3) "MySQL"
  10. 4) "CouchDB"
  11. 5) "Oracle"

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

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

其他信息

属性
复杂度O(N),其中 N 为被返回的元素数量。
版本要求不带 count 参数的 SRANDMEMBER 命令从 Redis 1.0.0 版本开始可用;带有 count 参数的 SRANDMEMBER 命令从 Redis 2.6.0 版本开始可用。