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

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

  1. SMOVE source target element

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

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

  1. redis> SMOVE databases nosql "Redis"
  2. (integer) 1 -- 移动成功
  3.  
  4. redis> SMOVE databases nosql "MongoDB"
  5. (integer) 1 -- 移动成功

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


图 5-4 SMOVE 命令的执行过程:

执行 SMOVE 命令之前的 databases 集合和 nosql 集合_images/IMAGE_SMOVE_1.png执行 SMOVE databases nosql "Redis" 之后_images/IMAGE_SMOVE_2.png执行 SMOVE databases nosql "MongoDB" 之后_images/IMAGE_SMOVE_3.png

忽略不存在的元素

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

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

  1. redis> SMOVE fruits favorite-fruits "dragon fruit"
  2. (integer) 0 -- 没有元素被移动

图 5-5 fruits 集合和 favorite-fruits 集合_images/IMAGE_IGNORE_SMOVE.png

覆盖已存在的元素

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

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

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

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


图 5-6 执行 SMOVE 命令之后的 fruits 集合和 favorite-fruits 集合_images/IMAGE_AFTER_OVERLAP.png

其他信息

属性
复杂度O(1)
版本要求SMOVE 命令从 Redis 1.0.0 版本开始可用。