SPOP:随机地从集合里面移除指定数量的元素

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

  1. SPOP key [count]

SPOP 命令会返回被移除的元素作为命令的返回值。

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

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

我们可以使用 SPOP 命令随机地移除 databases 集合中的元素:

  1. redis> SPOP databases -- 随机地移除一个元素
  2. "CouchDB" -- 被移除的是 "CouchDB" 元素
  3.  
  4. redis> SPOP databases -- 随机地移除一个元素
  5. "Redis" -- 被移除的是 "Redis" 元素
  6.  
  7. redis> SPOP databases 3 -- 随机地移除三个元素
  8. 1) "Neo4j" -- 被移除的元素是 "Neo4j" "PostgreSQL" "MySQL"
  9. 2) "PostgreSQL"
  10. 3) "MySQL"

图 5-11 展示了 databases 集合在执行各个 SPOP 命令时的变化过程。


图 5-11 databases 集合在执行 SPOP 命令时的变化过程

执行 SPOP 命令之前的 databases 集合_images/IMAGE_SPOP_1.png执行 SPOP databases ,导致元素 "CouchDB" 被移除_images/IMAGE_SPOP_2.png执行 SPOP databases ,导致元素 "Redis" 被移除_images/IMAGE_SPOP_3.png执行 SPOP databases 3 ,导致元素 "Neo4j""PostgreSQL""MySQL" 被移除_images/IMAGE_SPOP_4.png

SPOP 与 SRANDMEMBER 的区别

SPOP 命令和 SRANDMEMBER 命令的主要区别在于:SPOP 命令会移除被随机选中的元素,而 SRANDMEMBER 命令则不会移除被随机选中的元素。

通过查看 databases 集合目前包含的元素,我们可以证实之前被 SPOP 命令选中的元素已经不再存在于集合当中:

  1. redis> SMEMBERS databases
  2. 1) "MS SQL"
  3. 2) "MongoDB"
  4. 3) "Oracle"

SPOP 命令和 SRANDMEMBER 命令之间的另一个不同在于,SPOP 命令只接受正数 count 值,尝试向 SPOP 命令提供负数 count 值将引发错误,因为负数 count 值对于 SPOP 命令是没有意义的:

  1. redis> SPOP databases -3
  2. (error) ERR index out of range

其他信息

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