Redis 作为一款高性能的内存数据结构存储系统,其获取命令是用户与数据交互的核心操作,涵盖多种数据类型和复杂场景,通过合理运用获取命令,可以高效读取数据、验证存储状态并支撑业务逻辑,以下从基础命令到高级用法,结合不同数据类型详细解析 Redis 的获取命令体系。

基础数据类型的获取命令
Redis 的基础数据类型包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),每种类型都有对应的获取命令。
字符串(String)获取命令
字符串是 Redis 最简单的数据类型,获取命令主要用于读取存储的字符串值。
- GET:获取指定 key 的字符串值,若 key 不存在则返回
nil
。
示例:GET username
,若username
存储值为 "Alice",则返回 "Alice"。 - MGET:批量获取多个 key 的字符串值,返回一个列表,不存在的 key 对应位置为
nil
。
示例:MGET username age gender
,若仅username
存在,则返回 ["Alice", nil, nil]。
哈希(Hash)获取命令
哈希是 field-value 的映射表,获取命令支持读取单个或多个字段值。
- HGET:获取指定 key 中单个 field 的值,若 field 不存在则返回
nil
。
示例:HGET user:1 email
,获取user:1
这个哈希中email
字段的值。 - HMGET:批量获取指定 key 中多个 field 的值,返回字段值列表,不存在的 field 返回
nil
。
示例:HMGET user:1 name email phone
,返回 name、email、phone 对应的值列表。 - HGETALL:获取指定 key 中所有 field 和 value,返回一个列表,交替存放 field 和 value。
示例:HGETALL user:1
,可能返回 ["name", "Alice", "email", "alice@example.com"]。 - HKEYS:获取指定 key 中所有 field 的列表。
- HVALS:获取指定 key 中所有 value 的列表。
列表(List)获取命令
列表是按顺序排列的字符串元素,获取命令支持按索引范围或两端读取。

- LINDEX:获取指定 key 中 index 位置的元素,索引从 0 开始,支持负数索引(-1 表示最后一个元素)。
示例:LINDEX tasks 0
获取列表tasks
的第一个元素,LINDEX tasks -1
获取最后一个元素。 - LRANGE:获取指定 key 中 start 到 end 范围内的元素(闭区间),索引同 LINDEX。
示例:LRANGE tasks 0 2
获取tasks
的前三个元素。 - LLEN:获取指定 key 的列表长度。
集合(Set)获取命令
集合是唯一字符串元素的无序集合,获取命令主要用于获取元素或集合信息。
- SMEMBERS:获取指定 key 中的所有元素,返回无序列表。
示例:SMEMBERS tags
返回tags
集合的所有元素。 - SCARD:获取指定 key 的集合元素个数。
- SISMEMBER:判断指定元素是否在集合中,返回 1(存在)或 0(不存在)。
有序集合(Sorted Set)获取命令
有序集合通过分数(score)排序,获取命令支持按分数或排名读取元素。
- ZRANGE:获取指定 key 中排名在 start 和 end 之间的元素(按分数从低到高排序),返回元素列表。
示例:ZRANGE leaderboard 0 2
获取分数最低的前三个元素。 - ZREVRANGE:与 ZRANGE 类似,但按分数从高到低排序。
- ZRANGE WITHSCORES:在 ZRANGE 基础上返回元素及其分数,列表格式为 [元素1, 分数1, 元素2, 分数2]。
- ZSCORE:获取指定元素的分数,若元素不存在则返回
nil
。 - ZCARD:获取有序集合的元素个数。
高级获取命令与技巧
除了基础命令,Redis 还提供了一些高级获取命令,用于满足复杂场景需求。
渐进式获取(SCAN 系列命令)
当数据量较大时,使用 KEYS
命令会阻塞服务器,推荐使用渐进式获取命令。

- SCAN:增量式遍历所有 key,每次返回少量 key 和游标,下次扫描传入游标继续,直到游标为 0 表示结束。
示例:SCAN 0 MATCH user:* COUNT 100
,第一次扫描返回游标和匹配的 key 列表,后续用返回的游标继续扫描。 - SSCAN/HSCAN/ZSCAN:分别对应集合、哈希、有序集合的渐进式获取,用法类似 SCAN,但需指定 key。
条件获取与模式匹配
- EXISTS:检查 key 是否存在,返回 1(存在)或 0(不存在)。
- TYPE:获取 key 对应的数据类型(如 string、hash、list 等)。
- KEYS:获取符合模式的 key 列表(不推荐生产环境使用,可能阻塞服务器)。
示例:KEYS product:*
获取所有以 "product:" 开头的 key。
获取命令的性能优化
- Pipeline:将多个获取命令打包一次性发送,减少网络往返时间,提升批量获取效率。
- Lua 脚本:通过脚本将多个获取命令组合为原子操作,避免并发问题,例如同时获取多个哈希字段并计算结果。
获取命令的使用场景示例
以下通过表格总结常见数据类型的获取命令及其适用场景:
数据类型 | 获取命令 | 功能描述 | 适用场景示例 |
---|---|---|---|
String | GET/MGET | 读取单个/多个字符串值 | 获取用户名、配置信息等 |
Hash | HGET/HMGET | 读取单个/多个哈希字段值 | 获取用户属性、商品详情等 |
List | LRANGE/LINDEX | 读取列表范围元素/指定索引元素 | 获取消息队列、任务列表等 |
Set | SMEMBERS/SCARD | 读取集合所有元素/元素个数 | 获取标签、去重列表等 |
ZSet | ZRANGE/ZSCORE | 读取有序集合范围元素/元素分数 | 获取排行榜、带权重的推荐列表等 |
相关问答FAQs
Q1: Redis 中如何高效获取大量 key 的值,避免阻塞服务器?
A: 对于大量 key 的获取,应避免使用 KEYS
命令,推荐采用以下方法:
- SCAN 命令:使用
SCAN
及其变种(SSCAN/HSCAN/ZSCAN)进行渐进式遍历,每次处理少量数据,降低服务器负载。 - Pipeline 批量获取:若需获取多个 key 的值,可通过
MGET
或 Pipeline 将多个GET
命令合并发送,减少网络开销。 - 分片处理:若 key 数量极大,可结合业务逻辑分批获取,例如按 key 的前缀分片,每次处理一个分片的数据。
Q2: 获取 Redis 中不存在的 key 时,返回值是什么?如何判断 key 是否存在?
A: Redis 中获取不存在的 key 时,大多数命令会返回 nil
(GET
、HGET
、LINDEX
等),但部分命令返回特殊值:
SCARD
(集合元素个数)返回 0,ZCARD
(有序集合元素个数)返回 0。SISMEMBER
(判断元素是否在集合中)返回 0。
判断 key 是否存在,可使用以下命令:
- EXISTS:返回 1(存在)或 0(不存在),适用于所有数据类型。
- TYPE:若 key 不存在,返回 "none",同时能获取 key 的数据类型。
通过合理选择获取命令并结合业务场景优化,可以充分发挥 Redis 的高性能读取能力,为应用提供稳定的数据访问支持。