• 2021-02-23更新:SET命令新增EXATPXAT以及GET参数;新增GETDELGETEX命令。

Redis是一个当前非常流行的开源内存数据库,它支持包括字符串(String)、列表(List)、哈希集合(Hash)、集合(Set)、有序集合(Sorted Set)五种数据类型。在接下来一系列文章中,将在Redis支持的数据类型的基础上,介绍相关的操作命令。作为开篇,本文将先介绍字符串类型的操作命令。

本文中除特别注明的命令外,都只可被用于操作字符串类型的键值对。

SET

SET命令为指定名称的键设置字符串类型的值,若键已存在则覆盖旧值(未指定特定参数的情况下)。

SET key value [EX seconds|PX milliseconds] [EXAT timestamp|PXAT milliseconds-timestamp] [NX|XX] [KEEPTTL]

可选参数

SET命令有EXPXNXXX以及KEEPTTL五个可选参数,其中KEEPTTL为6.0版本添加的可选参数,其它为2.6.12版本添加的可选参数。

  • EX seconds:以秒为单位设置过期时间
  • PX milliseconds:以毫秒为单位设置过期时间
  • EXAT timestamp:设置以秒为单位的UNIX时间戳所对应的时间为过期时间
  • PXAT milliseconds-timestamp:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间
  • NX:键不存在的时候设置键值
  • XX:键存在的时候设置键值
  • KEEPTTL:保留设置前指定键的生存时间
  • GET:返回指定键原本的值,若键不存在时返回nil

SET命令使用EXPXNX参数,其效果等同于SETEXPSETEXSETNX命令。根据官方文档的描述,未来版本中SETEXPSETEXSETNX命令可能会被淘汰。

EXATPXAT以及GET为Redis 6.2新增的可选参数。

返回值

设置成功则返回OK;返回nil为未执行SET命令,如不满足NXXX条件等。

若使用GET参数,则返回该键原来的值,或在键不存在时返回nil

示例

设置greeting键的值,并随后设置新值:

# 设置键名greeting的值为hello world
redis> SET greeting "hello world"
OK
# 获取greeting键的值
redis> GET greeting
"hello world"
# 为greeting键设置新值
redis> SET greeting "hello redis"
OK
redis> GET greeting
"hello redis"

使用EX参数设置过期时间,并使用NX参数在键不存在的时候设置键值:

# 为greeting键设置10秒的过期时间
redis> SET greeting "hello world" EX 10
OK
# 获取剩余生存时间
redis> TTL greeting
(integer) 9
# 键不存在时设置
redis> SET greeting "hello redis" NX
(nil)
# 等待greeting过期后,使用TTL命令获取到的生存时间为-2
redis> TTL greeting
(integer) -2
# 使用NX参数设置成功
redis> SET greeting "hello redis" NX
OK

使用EXAT参数设置过期时间(PXAT参数同理):

# 假设当前时间为1577836800 (2020-01-01T00:00:00)
redis> SET greeting "hello world" EXAT 1577836900
OK
redis> TTL greeting
(integer) 99

使用KEEPTTL参数将会保留原键值对的生存时间:

redis> SET greeting "hello world" EX 100
OK
redis> TTL greeting
(integer) 99
redis> SET greeting "hello redis" KEEPTTL
OK
redis> TTL greeting
(integer) 97

使用GET参数返回键原值:

redis> SET greeting "hello world" GET
(nil)
redis> SET greeting "hello redis" GET
"hello world"

GET

GET命令为获取指定名称键的键值。

GET key

返回值

  • 当键存在且值为字符串时返回对应的值;
  • 当键不存在时返回nil
  • 当键值不为字符串时返回错误。

示例

redis> SET greeting "hello world"
OK
redis> GET greeting
"hello world"
redis> GET age
(nil)

当使用GET命令获取的键不为字符串时将返回错误:

# LPUSH为列表类型命令
redis> LPUSH students "John Doe"
(integer) 1
redis> GET students
(error) WRONGTYPE Operation against a key holding the wrong kind of value

GETSET

GETSET命令用于设置键值对的值并返回旧值,若键值对不存在则返回nil。若键存在但不为字符串类型,则返回错误。

GETSET key value

示例

redis> SET greeting "hello world"
OK
redis> GETSET greeting "hello redis"
"hello world"
redis> GET greeting
"hello redis"

DEL

DEL命令被用于删除指定的一个或多个键值对,当其中某个键值对不存在时将被忽略。DEL命令可被用于所有数据类型,不仅限于字符串。

DEL key [key ...]

DEL将返回被删除的键值对个数。

示例

redis> SET key1 "value1"
OK
redis> SET key2 "value2"
OK
redis> DEL key1 key2 key3
(integer) 2

EXPIRE / PEXPIRE

EXPIRE命令被用于设置某个键的过期时间,其值以秒作为单位。当设置过期时间后使用SET(不使用KEEPTTL参数)、GETSET等命令,所设置的过期时间将被覆盖。EXPIRE可被用于所有数据类型,不仅限于字符串。

EXPIRE key seconds

PEXPIRE命令以毫秒作为单位设置某个键的过期时间。

PEXPIRE key milliseconds

使用EXPIREPEXPIRE命令时,若传入的过期时间为一个非正整数,该键值对将被删除(触发的事件为del而非expire,即该键为被删除而不是过期)。

返回值

  • 当过期时间被设置,则返回1
  • 当键不存在,则返回0

示例

redis> SET greeting "hello"
OK
redis> EXPIRE greeting 10
(integer) 1
redis> TTL greeting
(integer) 9
# 覆盖过期时间
redis> SET greeting "hello redis"
OK
redis> TTL greeting
(integer) -1
# 为不存在的键设置过期时间
redis> EXPIRE none 10
(integer) 0

TTL / PTTL

TTL命令用于获取指定键的剩余生存时间(time to live, TTL),其值以秒作为生存时间的单位。TTL命令可被用于所有数据类型,不仅限于字符串。

TTL key

PTTL命令同样用于获取指定键的剩余生存时间,与TTL区别为其以毫秒作为单位。

PTTL key

返回值

  • 当键设置过期时间时,返回剩余的生存时间
  • 当键存在但未设置过期时间时,返回-1
  • 当键不存在时,返回-2

示例

redis> SET greeting "hello world"
OK
redis> TTL greeting
(integer) -1
# 设置10秒的过期时间
redis> EXPIRE greeting 10
(integer) 1
redis> TTL greeting
(integer) 9
# 等待greeting键过期
redis> TTL greeting
(integer) -2

SETEX / PSETEX

SETEX命令为指定名称的键设置值,并以秒为单位设置其生存时间。

SETEX key seconds value

SETEX命令效果等同于使用SET key valueEXPIRE key seconds命令,以及SET key value EX seconds命令。SETEX命令具备原子性,它等同于在MULTI/EXEC块中使用SET以及EXPIRE命令。

redis> SETEX mykey 10 "test"
# 等同于
redis> SET mykey "test" EX 10
# 等同于
redis> MULTI
redis> SET mykey "test"
redis> EXPIRE mykey 10
redis> EXEC

PSETEX命令与SETEX命令相似,二者区别为PSETEX设置的生存时间以毫秒作为单位。

PSETEX key milliseconds value

示例

SETEX命令的使用:

# 过期时间不正确
redis> SETEX greeting -1 "hello"
(error) ERR invalid expire time in setex
redis> SETEX greeting 99999999999999 "hello"
(error) ERR value is not an integer or out of range
# 设置争取的过期时间
redis> SETEX greeting 10 "hello"
OK

PSETEX命令的使用:

# 生存时间为10000毫秒(10秒)
redis> PSETEX greeting 10000 "hello"
OK
redis> PTTL greeting
(integer) 9885
redis> TTL greeting
(integer) 9

SETNX

当指定名称的键不存在时设置字符串值,否则不执行操作。其效果等同于在键不存在时直接使用SET命令,或是在任意情况下使用NX参数。

SETNX key value

返回值

当成功设置键值时返回1,否则返回0(即键已存在的情况下)。

示例

redis> SETNX mykey "hello"
(integer) 1
redis> SETNX mykey "redis"
(integer) 0
redis> GET mykey
"hello"

MSET

MSET命令用于设置一个或多个键值对,该命令永远返回OKMSETSET命令相同,都会替代存在的键的值。

MSET key value [key value ...]

MSET命令具有原子性,所有的键都会一起被设置。其不存在一部分键值被更新,另一部分仍为旧值的情况。

示例

redis> MSET key1 "value1" key2 "value2"
OK
redis> GET key1
"value1"
redis> GET key2
"value2"

MGET

MGET用于获取所有指定的键值。当某个键不存在时,将返回一个特殊的值nil

MGET key [key ...]

示例

redis> MSET key1 "value1" key3 "value3"
OK
redis> GET key1 key2 key3
1) "value1"
2) (nil)
3) "value3"

MSETNX

MSETNX命令用于设置一个或多个键值对,仅当所有键都不存在时才会执行。同样,MSETNX也具备原子性,所有的键会被一起被设置。

MSETNX key value [key value ...]

返回值

  • 当所有的键被设置,则返回1
  • 当所有的键都没有被设置,即至少一个键已存在的情况,则返回0

示例

redis> MSETNX mykey1 "value1" mykey2 "value2"
(integer) 1
redis> MSETNX mykey2 "new value" myKey3 "value3"
(integer) 0
redis> MGET key1 key2 key3
1) "value1"
2) "value2"
3) (nil)

GETDEL

GETDEL命令是Redis 6.2.0中新增的命令,它用于获取指定键值对的值,并在获取后将其删除(仅限于该键值对类型为字符串时)。

GETDEL key

返回值

GETDEL命令将在键存在时返回其原来的值,或在不存在时返回nil。若键不是字符串类型,使用该命令将返回错误。

示例

redis> SET greeting "hello world"
OK
redis> GETDEL greeting
"hello world"
redis> GET greeting
(nil)
# 不存在的键将返回nil
redis> GETDEL greeting
(nil)

GETEX

GETEX命令同样也是Redis 6.2.0中新增的命令,它用于获取指定键值对的值,并设置或移除该键值对的过期时间。

GETEX key [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]

GETEX命令支持EXPXEXATPXAT以及PERSIST,分别为:

  • EX:设置以秒为单位的过期时间
  • PX:设置以毫秒为单位的过期时间
  • EXAT:设置以秒为单位的UNIX时间戳所对应的时间为过期时间
  • PXAT:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间
  • PERSIST:移除键值对关联的过期时间

返回值

当键值对存在且为字符串类型时GETEX命令将返回其值,若不存在则返回nil

示例

redis> SET greeting "hello world"
OK
redis> TTL greeting
(integer) -1
redis> GETEX greeting EX 100
"hello world"
redis> TTL greeting
(integer) 99
redis> GETEX greeting PERSIST
"hello world"
redis> TTL greeting
(integer) -1

GETEX未携带参数时效果等同于GET命令:

redis> SET greeting "hello world"
OK
redis> GETEX greeting
"hello world"
redis> TTL greeting
(integer) -1

结束语

本文简单的介绍了Redis中对于字符串类型键的一些基本操作命令,接下来的文章中将继续介绍Redis中对字符串值操作的一些命令以及其它类型的操作命令。

参考文献