Redis 常见数据类型(一):全局通用命令详解
Redis 作为当下最热门的高性能键值数据库,它的 5 种核心数据结构是我们开发和运维的重中之重。想要用好 Redis,先得把 "通用钥匙" 摸透 ------ 也就是对所有 key 都生效的全局命令。今天我们就从预备知识入手,把这些基础命令讲得明明白白,为后面深入学习数据结构打好地基。
一、预备知识:为什么要先学全局命令?
在正式介绍 5 种数据结构之前,了解 Redis 的全局命令、数据结构和内部编码、单线程命令处理机制,能帮我们解决两个核心痛点:
-
告别死记硬背:Redis 命令上百个,但很多命令逻辑高度通用,理解底层机制后,学习效率会大幅提升。
-
避免踩坑翻车:Redis 不是万能的,有些命令和数据结构使用不当,可能会对 Redis 服务或业务应用造成致命伤害。
Redis 的所有数据结构,本质上都是 "键值对" 中的 "值",而针对 "键" 的操作,有一套所有数据结构都通用的命令,我们一个一个来看。
二、KEYS:按模式匹配查找 key
KEYS 命令可以返回所有满足指定模式(pattern)的 key,支持通配符匹配,是批量查找 key 的利器。
通配符规则
-
?:匹配单个字符,比如h?llo能匹配hello、hallo、hxllo -
\*:匹配任意多个字符(包括 0 个),比如h\*llo能匹配hllo、heeeello -
\[\]:匹配指定范围内的单个字符,比如h\[ae\]llo匹配hello和hallo,但不匹配hillo -
\[^\]:匹配不在指定范围内的单个字符,比如h\[^e\]llo匹配hallo、hbllo,但不匹配hello -
\[a\-b\]:匹配 a 到 b 之间的单个字符,比如h\[a\-b\]llo匹配hallo和hbllo
基础信息
-
语法:
KEYS pattern -
有效版本:Redis 1.0.0 及以上
-
时间复杂度:O (N),N 为数据库中 key 的总数
-
返回值:匹配 pattern 的所有 key 列表
使用示例
bash
# 批量设置3个key
redis> MSET firstname Jack lastname Stuntman age 35
"OK"
# 匹配包含name的key
redis> KEYS *name*
1) "firstname"
2) "lastname"
# 匹配以a开头、后接两个字符的key
redis> KEYS a??
1) "age"
# 匹配所有key(线上环境慎用!)
redis> KEYS *
1) "age"
2) "firstname"
3) "lastname"
⚠️ 注意:KEYS \* 会遍历所有 key,在 key 数量极多的生产环境中执行,会阻塞 Redis 主线程,导致服务短暂不可用,线上环境一定要避免直接使用。
三、EXISTS:判断 key 是否存在
EXISTS 命令用来检查一个或多个 key 是否存在,是我们操作 key 前常用的前置校验命令。
基础信息
-
语法:
EXISTS key \[key \.\.\.\] -
有效版本:Redis 1.0.0 及以上
-
时间复杂度:O (1)
-
返回值:存在的 key 的数量(支持同时判断多个 key)
使用示例
bash
# 设置一个key
redis> SET key1 "Hello"
"OK"
# 判断单个key是否存在
redis> EXISTS key1
(integer) 1 # 1表示存在
# 判断不存在的key
redis> EXISTS nosuchkey
(integer) 0 # 0表示不存在
# 同时判断多个key
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2 # 只有key1和key2存在,返回2
四、DEL:删除指定的 key
DEL 命令用于删除一个或多个已存在的 key,支持批量删除,执行效率很高。
基础信息
-
语法:
DEL key \[key \.\.\.\] -
有效版本:Redis 1.0.0 及以上
-
时间复杂度:O (1)
-
返回值:成功删除的 key 的数量
使用示例
bash
# 设置两个key
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
# 批量删除key1、key2和不存在的key3
redis> DEL key1 key2 key3
(integer) 2 # 成功删除2个key
五、EXPIRE & TTL:给 key 设置过期时间
Redis 支持给 key 设置过期时间,到期后 key 会被自动删除,这两个命令是实现过期机制的核心。
1. EXPIRE:设置 key 的过期时间
EXPIRE 命令为指定的 key 添加秒级的过期时间(TTL,Time To Live)。
-
语法:
EXPIRE key seconds -
有效版本:Redis 1.0.0 及以上
-
时间复杂度:O (1)
-
返回值:
1表示设置成功,0表示 key 不存在或设置失败
2. TTL:获取 key 的剩余过期时间
TTL 命令可以查询 key 的剩余过期时间(秒级)。
-
语法:
TTL key -
有效版本:Redis 1.0.0 及以上
-
时间复杂度:O (1)
-
返回值:
-
正数:剩余的秒数
-
\-1:key 存在但没有设置过期时间 -
\-2:key 不存在
-
使用示例
bash
# 设置一个key并给它设置10秒过期
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
# 查看剩余过期时间
redis> TTL mykey
(integer) 10
💡 补充:EXPIRE 和 TTL 都有毫秒级的对应版本:PEXPIRE 和 PTTL,用法完全一致,只是时间单位换成毫秒。
过期机制示意图
我们可以用时间轴来理解 key 的过期过程:
Plain
时间轴 →
|------- set key value ----|---- get key(能拿到值)----|---- Redis淘汰key(get返回nil)
| |
|-- expire key n(设置过期时间n秒)--|
-
key 设置过期时间后,会在当前时间 + 过期时间的节点被标记为过期
-
过期的 key 不会立即被删除,Redis 会通过定期删除和惰性删除的策略清理它们
六、TYPE:查看 key 的数据类型
Redis 支持多种数据结构,TYPE 命令可以快速查看一个 key 对应的值的类型,帮我们避免命令使用错误。
基础信息
-
语法:
TYPE key -
有效版本:Redis 1.0.0 及以上
-
时间复杂度:O (1)
-
返回值:key 的数据类型,包括
none(key 不存在)、string、list、set、zset、hash、stream
使用示例
bash
# 设置不同类型的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"
七、小结:全局命令的核心价值
这几个全局命令,是我们和 Redis 交互的 "基础操作手册":
-
KEYS帮我们批量查找 key,EXISTS帮我们校验 key 是否存在 -
DEL实现 key 的删除,EXPIRE/TTL实现 key 的生命周期管理 -
TYPE帮我们快速识别 key 的数据类型,避免命令用错
它们不仅是后续学习 5 种数据结构的热身,更是 Redis 日常运维和业务开发中高频使用的命令。下一篇我们就开始深入 Redis 最基础的数据结构 ------ 字符串(String),聊聊它的用法和应用场景。