SPOP:随机地从集合里面移除指定数量的元素
通过使用 SPOP
命令,用户可以从集合里面随机地移除指定数量的元素。SPOP
命令接受一个可选的 count
参数,用于指定需要被移除的元素数量;如果用户没有给定这个参数,那么 SPOP
命令默认只移除一个元素:
- SPOP key [count]
SPOP
命令会返回被移除的元素作为命令的返回值。
举个例子,对于包含以下元素的 databases
集合来说:
- redis> SMEMBERS databases
- 1) "MS SQL"
- 2) "MongoDB"
- 3) "Redis"
- 4) "Neo4j"
- 5) "PostgreSQL"
- 6) "MySQL"
- 7) "Oracle"
- 8) "CouchDB"
我们可以使用 SPOP
命令随机地移除 databases
集合中的元素:
- redis> SPOP databases -- 随机地移除一个元素
- "CouchDB" -- 被移除的是 "CouchDB" 元素
- redis> SPOP databases -- 随机地移除一个元素
- "Redis" -- 被移除的是 "Redis" 元素
- redis> SPOP databases 3 -- 随机地移除三个元素
- 1) "Neo4j" -- 被移除的元素是 "Neo4j" 、 "PostgreSQL" 和 "MySQL"
- 2) "PostgreSQL"
- 3) "MySQL"
图 5-11 展示了 databases
集合在执行各个 SPOP
命令时的变化过程。
图 5-11 databases
集合在执行 SPOP
命令时的变化过程
执行 SPOP
命令之前的 databases
集合执行 SPOP databases
,导致元素 "CouchDB"
被移除执行 SPOP databases
,导致元素 "Redis"
被移除执行 SPOP databases 3
,导致元素 "Neo4j"
、 "PostgreSQL"
和 "MySQL"
被移除
SPOP 与 SRANDMEMBER 的区别
SPOP
命令和 SRANDMEMBER
命令的主要区别在于:SPOP
命令会移除被随机选中的元素,而 SRANDMEMBER
命令则不会移除被随机选中的元素。
通过查看 databases
集合目前包含的元素,我们可以证实之前被 SPOP
命令选中的元素已经不再存在于集合当中:
- redis> SMEMBERS databases
- 1) "MS SQL"
- 2) "MongoDB"
- 3) "Oracle"
SPOP
命令和 SRANDMEMBER
命令之间的另一个不同在于,SPOP
命令只接受正数 count
值,尝试向 SPOP
命令提供负数 count
值将引发错误,因为负数 count
值对于 SPOP
命令是没有意义的:
- redis> SPOP databases -3
- (error) ERR index out of range
其他信息
属性 | 值 |
---|---|
复杂度 | O(N),其中 N 为被移除的元素数量。 |
版本要求 | 不带 count 参数的 SPOP 命令从 Redis 1.0.0 版本开始可用;带有 count 参数的 SPOP 命令从 Redis 3.2.0 版本开始可用。 |