SET:为字符串键设置值

创建字符串键最常用的方法就是使用 SET 命令,这个命令可以为一个字符串键设置相应的值。在最基本的情况下,用户只需要向 SET 命令提供一个键和一个值就可以了:

  1. SET key value

跟之前提到过的一样,这里的键和值既可以是文字也可以是二进制数据。

SET 命令在成功创建字符串键之后将返回 OK 作为结果。比如说,通过执行以下命令,我们可以创建出一个字符串键,它的键为 "number" ,值为 "10086"

  1. redis> SET number "10086"
  2. OK

又比如说,通过执行以下命令,我们可以创建出一个键为 "book" ,值为 "The Design and Implementation of Redis" 的字符串键:

  1. redis> SET book "The Design and Implementation of Redis"
  2. OK

图 2-2 和图 2-3 分别展示了数据库在以上两条 SET 命令执行之前以及执行之后的状态。


图 2-2 执行 SET 命令之前,数据库的状态_images/IMAGE_BEFORE_SET.png


图 2-3 执行 SET 命令之后,数据库的状态_images/IMAGE_AFTER_SET.png


注解

数据库键的存放方式

为了方便阅读,本书总会将数据库中新出现的键放置到已有键的下方。比如在上面展示的数据库图 2-3 里面,我们就将新添加的 "number" 键和 "book" 键放置到了已有键的下方。

在实际中,Redis 数据库是以无序的方式存放数据库键的,一个新加入的键可能会出现在数据库的任何位置上,因此我们在使用 Redis 的过程中不应该对键在数据库中的摆放位置做任何假设,以免造成错误。

改变覆盖规则

在默认情况下,对一个已经设置了值的字符串键执行 SET 命令将导致键的旧值被新值覆盖。

举个例子,如果我们连续执行以下两条 SET 命令,那么第一条 SET 命令设置的值将被第二条 SET 命令设置的值所覆盖:

  1. redis> SET song_title "Get Wild"
  2. OK
  3.  
  4. redis> SET song_title "Running to Horizon"
  5. OK

在第二条 SET 命令执行完毕之后,song_title 键的值将从原来的 "Get Wild" 变为 "Running to Horizon"

从 Redis 2.6.12 版本开始,用户可以通过向 SET 命令提供可选的 NX 选项或者 XX 选项来指示 SET 命令是否要覆盖一个已经存在的值:

  1. SET key value [NX|XX]

如果用户在执行 SET 命令时给定了 NX 选项,那么 SET 命令只会在键没有值的情况下执行设置操作,并返回 OK 表示设置成功;如果键已经存在,那么 SET 命令将放弃执行设置操作,并返回空值 nil 表示设置失败。

以下代码展示了带有 NX 选项的 SET 命令的行为:

  1. redis> SET password "123456" NX
  2. OK -- 对尚未有值的 password 键进行设置,成功
  3.  
  4. redis> SET password "999999" NX
  5. (nil) -- password 键已经有了值,设置失败

因为第二条 SET 命令没有改变 password 键的值,所以 password 键的值仍然是刚开始时设置的 "123456"

另一方面,如果用户在执行 SET 命令时给定了 XX 选项,那么 SET 命令只会在键已经有值的情况下执行设置操作,并返回 OK 表示设置成功;如果给定的键并没有值,那么 SET 命令将放弃执行设置操作,并返回空值表示设置失败。

举个例子,如果我们对一个没有值的键 mongodb-homepage 执行以下 SET 命令,那么命令将因为 XX 选项的作用而放弃执行设置操作:

  1. redis> SET mongodb-homepage "mongodb.com" XX
  2. (nil)

相反地,如果我们对一个已经有值的键执行带有 XX 选项的 SET 命令,那么命令将使用新值去覆盖已有的旧值:

  1. redis> SET mysql-homepage "mysql.org"
  2. OK -- 为键 mysql-homepage 设置一个值
  3.  
  4. redis> SET mysql-homepage "mysql.com" XX
  5. OK -- 对键的值进行更新

在第二条 SET 命令执行之后,mysql-homepage 键的值将从原来的 "mysql.org" 更新为 "mysql.com"

其他信息

属性
复杂度O(1)
版本要求不带任何可选项的 SET 命令从 Redis 1.0.0 版本开始可用;带有 NXXX 等可选项的 SET 命令从 Redis 2.6.12 版本开始可用。