1. Redis基础命令

Redis作为 KV 型数据库,基础命令则主要包含了针对 Key 的相关操作,所有命令如下所示:

2. 常用命令

2.1 KEYS

KEYS 命令用于查找所有匹配给定模式的 key ,返回匹配的 key 的列表。操作的时间复杂度是O(N),但是常量时间相当小,在一个普通笔记本上扫描 100 万个 key 只要 40 毫秒。适合用来调试和特殊操作,比如改变键空间布局。

注意事项:

  • 生产环境谨慎使用,数据量很大时会影响性能。
  • 不要在代码中使用 KEYS ,如果你需要一个寻找键空间中的 key子集,考虑使用 SCAN命令 或 Set 集合。

基本语法:

KEYS pattern

匹配模式:

  • h?llo 匹配 hellohallohxllo
  • hh*llo 匹配 hlloheeeello
  • hh[ae]llo 匹配 hellohallo,不匹配 hillo
  • hh[^e]llo 匹配 hallo, hbllo...不匹配 hello
  • hh[a-b]llo 匹配 hallohbllo

示例:

# 创建一些 key 并赋值
redis> MSET firstname Jack lastname Stuntman age 35
"OK"
# 查找含有 name 的 key
redis> KEYS *name*
1) "firstname"
2) "lastname"
# 查找以 a 为开头长度为 3 的 key
redis> KEYS a??
1) "age"
# redis 获取所有的 key 使用 *。
redis> KEYS *
1) "firstname"
2) "lastname"
3) "age"

2.2 DEL

DEL 命令用于删除给定的一个或多个key ,不存在的 key 会被忽略,返回值为被删除 key 的数量。

基本语法:

DEL key [key ...]

示例:

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> SET key3 "redis.com.cn"
"OK"
redis> DEL key1 key2 key3 key4
(integer) 3

2.3 EXISTS

DEL 命令用于检查给定 key 是否存在,检查多个 key 返回值为存在的 key 的个数,检查单个 key 返回 10

注意事项:

  • 如果相同的 key 在参数列表中出现了多次,它会被计算多次。所以,如果somekey存在,EXISTS somekey somekey 命令返回 2

基本语法:

EXISTS key [key ...]

示例:

redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2

2.4 EXPIRE

EXPIRE 命令用于设置 key 的过期时间(秒),设置的时间过期后,key 会被自动删除,带有超时时间的 key 通常被称为易失的。

注意事项:

  • 已经设置过期的 key,可以调用 EXPIRE 重新设置。在这种情况下 key 的生存时间被更新为新值。
  • 已存在的旧 key 使用 RENAME 改名,那么新 key 会继承所有旧 key 的属性。key 使用 RENAME 改名后,过期时间被转移到新 key 上。
  • 通过使用 PERSIST 命令把 key 改回持久的 key,这样 key 的过期时间也可以被清除。
  • 超时时间只能使用删除 key 或者覆盖 key 的命令清除,包括 DEL, SET, GETSE 和所有的 *STORE 命令。
  • 对于修改 key 中存储的值,而不是用新值替换旧值的命令,不会修改超时时间。
  • 使用 EXPIRE/PEXPIRE 设置的过期时间为负数,或者使用EXPIREAT/PEXPIREAT设置过期时间戳为过去的时间会导致 key 被删除。
  • key 的过期时间以绝对 Unix 时间戳的方式存储。这意味无论 Redis 是否运行,过期时间都会流逝。
  • 服务器的时间必须稳定准确,这样过期时间才能更准确。如果在两个时间相差较多的机器之间移动 RDB 文件,那么可能会出现所有的 key在加载的时候都过期了。
  • 运行的 Redis 也会不停的检查服务器的时间,如果你设置一个带有 1000 秒过期时间的key,然后你把服务器的时间向前调了 2000 秒,那么这个 key 会立刻过期,不是等 1000 秒后过期。

返回值:

  • 1 :设置超时成功
  • 0key 不存在

基本语法:

EXPIRE key seconds

典型应用场景:

  • 会话 Session
  • 短信验证码

示例:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
redis> SET mykey "Hello World"
"OK"
redis> TTL mykey
(integer) -1

过期策略:

  • 懒惰删除:用户访问某个 key 的时候,如果过期了就立即删除。如果一个 key 已经过期了,如果长时间没有被访问,那么这个 key 就会一直存留在内存之中,严重消耗了内存资源。
  • 定期删除:除了惰性删除,Redis 还加入了定期删除。将所有设置了过期时间的 key放入一个字典中,然后每隔一段时间从字典中随机一些 key检查过期时间并删除已过期的 key。同时,为了保证不出现循环过度的情况,Redis 还设置了扫描的时间上限,默认不会超过 25ms

2.5 TTL

TTL 命令以秒为单位返回 key 的剩余过期时间。

返回值

  • -2key 不存在返回
  • -1key 存在但是没有关联超时时间返回
  • 正整数: 剩余超时秒数

基本语法:

TTL key

示例:

redis> SET mykey "Hello"
"OK"
# key 存在,但没有设置剩余生存时间
redis> TTL mykey
(integer) -1
redis> EXPIRE mykey 10
(integer) 1
# 有剩余生存时间的 key
redis> TTL mykey
(integer) 10

2.6 RENAME

RENAME 命令用于修改 key 的名字为 newkey ,若 key 不存在返回错误。

基本语法:

RENAME key newkey

注意事项:

  • 在集群模式下,keynewkey 需要在同一个 hash slotkeynewkey 有相同的 hash tag 才能重命名。
  • 如果 newkey 存在则会被覆盖,此种情况隐式执行了 DEL 操作,所以如果要删除的 key 的值很大会有一定的延时,即使 RENAME 本身是常量时间复杂度的操作。

示例:

# key 存在且 newkey 不存在
redis> SET mykey "Hello"
"OK"
redis> RENAME mykey myotherkey
"OK"
redis> GET myotherkey
"Hello"
# 当 key 不存在时,返回错误
redis> RENAME fake_key never_exists
ERR ERR no such key
# newkey 已存在时, RENAME 会覆盖旧 newkey
redis> SET pc "lenovo"
"OK"
redis> SET personal_computer "dell"
"OK"
redis> RENAME pc personal_computer
"OK"
redis> GET pc
(nil)
# 原来的值 dell 被覆盖了
redis> GET personal_computer
"lenovo"

2.7 TYPE

TYPE 命令用于以字符串的形式返回存储在 key中的值的类型, key 不存在时返回 none

基本语法:

TYPE key

示例:

redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"

2.8 PERSIST

PERSIST 命令用于删除给定 key 的过期时间,使得 key 永不过期。

基本语法:

PERSIST KEY_NAME

返回值:

  • 1 :当过期时间移除成功时
  • 0 :如果 key 不存在或 key 没有设置过期时间

示例:

redis> SET mykey "Hello"
"OK"
# 为 key 设置生存时间
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
# 移除 key 的生存时间
redis> PERSIST mykey
(integer) 1
redis> TTL mykey
(integer) -1