set key value [expiration EX seconds|PX milliseconds] [NX|XX]

  • EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value。
  • PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
  • NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value
    -XX : 只在键已经存在时, 才对键进行设置操作。
    在 Redis 2.6.12 版本以前, SET 命令总是返回 OK 。

从 Redis 2.6.12 版本开始, SET 命令只在设置操作成功完成时才返回 OK ; 如果命令使用了 NX或者 XX 选项, 但是因为条件没达到而造成设置操作未执行, 那么命令将返回空批量回复(NULL Bulk Reply)

示例

####### 对已经存在的值进行设置,会覆盖
127.0.0.1:6379[2]> set key “value”
OK
127.0.0.1:6379[2]> get key
“value”
127.0.0.1:6379[2]> set key “new-value”
OK
127.0.0.1:6379[2]> get key
“new-value”
127.0.0.1:6379[2]>
————————————————
####### 使用EX 选项一 使用ex
127.0.0.1:6379[2]> set key-expire-time “value” ex 20
OK
127.0.0.1:6379[2]> get key-expire-time
“value”
127.0.0.1:6379[2]> ttl key-expire-time
(integer) 12
127.0.0.1:6379[2]> ttl key-expire-time
(integer) 10
127.0.0.1:6379[2]> ttl key-expire-time
(integer) 10
127.0.0.1:6379[2]> ttl key-expire-time
(integer) 9
127.0.0.1:6379[2]> get key-expire-time
“value”
127.0.0.1:6379[2]> get key-expire-time
(nil)
127.0.0.1:6379[2]>————————————————
二使用 setex
127.0.0.1:6379[2]> SETEX key-expire-time-nx 10 “hello”
OK
127.0.0.1:6379[2]> get key-expire-time-nx
“hello”
127.0.0.1:6379[2]> ttl key-expire-time-nx
(integer) 2
127.0.0.1:6379[2]> ttl key-expire-time-nx
(integer) 1
127.0.0.1:6379[2]> ttl key-expire-time-nx
(integer) -2
127.0.0.1:6379[2]> get key-expire-time-nx
(nil)
127.0.0.1:6379[2]>————————————————
三 使用PSETEX
127.0.0.1:6379[2]> PSETEX key-expire-time-px 10086 “px-hello”
OK
127.0.0.1:6379[2]> get key-expire-time-px
“px-hello”
127.0.0.1:6379[2]> PTTL key-expire-time-px
(integer) 303
127.0.0.1:6379[2]> PTTL key-expire-time-px
(integer) -2
127.0.0.1:6379[2]> get key-expire-time-px
(nil)
127.0.0.1:6379[2]>————————————————
nx 只在键不存在时, 才对键进行设置操作
使用 nx
127.0.0.1:6379[2]> EXISTS not-exists-key
(integer) 0
127.0.0.1:6379[2]> set not-exists-key “value” nx
OK
127.0.0.1:6379[2]> get not-exists-key
“value”
127.0.0.1:6379[2]> set not-exists-key “new-value” nx
(nil) # 修改失败
127.0.0.1:6379[2]> get not-exists-key
“value” # 修改失败
————————————————
xx 只在键存在时, 才对键进行设置操作
127.0.0.1:6379[2]> EXISTS exists-key
(integer) 0 # 对应的key不存在
127.0.0.1:6379[2]> SET exists-key “value” xx
(nil) # 使用xx设置失败
127.0.0.1:6379[2]> SET exists-key “value”
OK #设置对应的key-value
127.0.0.1:6379[2]> SET exists-key “new-value” xx
OK # 再使用xx修改
127.0.0.1:6379[2]> get exists-key
“new-value” # 修改成功
127.0.0.1:6379[2]>
————————————————

Redis的setnx命令是当key不存在时设置key,但setnx不能同时完成expire设置失效时长,不能保证setnx和expire的原子性。我们可以使用set命令完成setnx和expire的操作,并且这种操作是原子操作。
下面是set命令的可选项:

set key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds:设置失效时长,单位秒
PX milliseconds:设置失效时长,单位毫秒
NX:key不存在时设置value,成功返回OK,失败返回(nil)
XX:key存在时设置value,成功返回OK,失败返回(nil)

案例:设置name=p7+,失效时长100s,不存在时设置
1.1.1.1:6379> set name p7+ ex 100 nx
OK
1.1.1.1:6379> get name
"p7+"
1.1.1.1:6379> ttl name
(integer)