SMOVE:将元素从一个集合移动到另一个集合

SMOVE 命令允许用户将指定的元素从源集合移动到目标集合:

SMOVE source target element

SMOVE 命令在移动操作成功执行时返回 1。如果指定的元素并不存在于源集合,那么 SMOVE 命令将返回 0,表示移动操作执行失败。

以下代码展示了如何通过 SMOVE 命令将存在于 databases 集合的 "Redis" 元素以及 "MongoDB" 元素移动到 nosql 集合中:

redis> SMOVE databases nosql "Redis"
(integer) 1 -- 移动成功
redis> SMOVE databases nosql "MongoDB"
(integer) 1 -- 移动成功

图5-4 展示了这两个 SMOVE 命令的执行过程。

image 2025 01 03 17 43 32 880
Figure 1. 图5-4 SMOVE命令的执行过程

忽略不存在的元素

如果用户想要移动的元素并不存在于源集合,那么 SMOVE 将放弃执行移动操作,并返回0表示移动操作执行失败。

举个例子,对于图5-5所示的 fruits 集合和 favorite-fruits 集合来说,尝试把不存在于 fruits 集合的 "dragon fruit" 元素移动到 favorite-fruits 集合将会导致 SMOVE 命令执行失败:

redis> SMOVE fruits favorite-fruits "dragon fruit"
(integer) 0 -- 没有元素被移动
image 2025 01 03 17 44 44 154
Figure 2. 图5-5 fruits集合和favorite-fruits集合

覆盖已存在的元素

即使用户想要移动的元素已经存在于目标集合,SMOVE 命令仍然会将指定的元素从源集合移动到目标集合,并覆盖目标集合中的相同元素。从结果来看,这种移动不会改变目标集合包含的元素,只会导致被移动的元素从源集合中消失。

以图5-5 中展示的 fruits 集合和 favorite-fruits 集合为例,如果我们执行以下代码:

redis> SMOVE fruits favorite-fruits "apple"
(integer) 1

那么,fruits 集合中的 "apple" 元素将被移动到 favorite-fruits 集合里面,覆盖掉 favorite-fruits 集合原有的 "apple" 元素。从结果来看,"apple" 元素将从 fruits 集合中消失,而 favorite-fruits 集合包含的元素则不会发生变化。图 5-6 展示了上面的 SMOVE 命令执行之后的 fruits 集合和 favorite-fruits 集合。

image 2025 01 03 17 46 50 366
Figure 3. 图5-6 执行SMOVE命令之后的fruits集合和favorite-fruits集合

其它信息

  • 复杂度:O(1)。

  • 版本要求:SMOVE 命令从 Redis 1.0.0 版本开始可用。