MSETNX:只在键不存在的情况下,一次为多个字符串键设置值

MSETNX 命令跟 MSET 命令一样,都可以对多个字符串键进行设置:

  1. MSETNX key value [key value ...]

MSETNXMSET 的主要区别在于 MSETNX 只会在所有给定键都不存在的情况下对键进行设置,而不会像 MSET 那样直接覆盖键已有的值:如果在给定键当中,有哪怕一个键已经有值了,那么 MSETNX 命令也会放弃对所有给定键的设置操作。MSETNX 命令在成功执行设置操作时返回 1 ,在放弃执行设置操作时则返回 0

在以下的这段代码中,因为键 k4 已经存在,所以 MSETNX 将放弃对键 k1k2k3k4 进行设置操作:

  1. redis> MGET k1 k2 k3 k4
  2. 1) (nil) -- k1 k2 k3 都不存在
  3. 2) (nil)
  4. 3) (nil)
  5. 4) "hello world" -- k4 已存在
  6.  
  7. redis> MSETNX k1 "one" k2 "two" k3 "three" k4 "four"
  8. (integer) 0 -- 因为键 k4 已存在,所以 MSETNX 未能执行设置操作
  9.  
  10. redis> MGET k1 k2 k3 k4 -- 各个键的值没有变化
  11. 1) (nil)
  12. 2) (nil)
  13. 3) (nil)
  14. 4) "hello world"

但是如果我们只对不存在的键 k1k2k3 进行设置,那么 MSETNX 可以正常地完成设置操作:

  1. redis> MSETNX k1 "one" k2 "two" k3 "three"
  2. (integer) 1 -- 所有给定键都不存在,成功执行设置操作
  3.  
  4. redis> MGET k1 k2 k3 k4
  5. 1) "one" -- 刚刚使用 MSETNX 设置的三个值
  6. 2) "two"
  7. 3) "three"
  8. 4) "hello world" -- 之前已经存在的键 k4 的值没有改变

其他信息

属性
复杂度O(N),其中 N 为用户给定的字符串键数量。
版本要求MSETNX 命令从 Redis 1.0.1 开始可用。