Redis 核心数据结构与常用命令详解
✅ 引言
Redis 不仅仅是一个“缓存”,它之所以强大,是因为它提供了 丰富且高效的核心数据结构,每种结构都针对特定场景进行了优化。掌握这些数据结构及其常用命令,是用好 Redis 的关键。
本文将系统讲解 Redis 的 五大核心数据结构:
- ✅ String(字符串)
- ✅ Hash(哈希)
- ✅ List(列表)
- ✅ Set(集合)
- ✅ ZSet(有序集合)
并为每种结构提供 真实应用场景 + 完整命令示例 + 使用建议,助你从“会用”到“用好”Redis。
📌 一、String(字符串)—— 最基础也最常用
1.1 特点
- Redis 中最基本的数据类型。
- 二进制安全,可以存储文本、序列化对象、图片等。
- 单个 value 最大支持 512MB。
1.2 常用命令
# 1. 设置值
SET user:1:name "Alice"
OK# 2. 获取值
GET user:1:name
"Alice"# 3. 设置过期时间(秒)
SETEX session:abc123 3600 "user_id=1001"
OK# 4. 只有 key 不存在时才设置(实现分布式锁基础)
SETNX lock:order:123 "true"
(integer) 1 # 返回 1 表示设置成功# 5. 自增/自减(计数器神器)
INCR page:view:1001 # 浏览量 +1
(integer) 1
INCRBY score:user:1 10 # 分数 +10
(integer) 95# 6. 批量操作
MSET user:2:name "Bob" user:2:age "25"
OK
MGET user:1:name user:2:name
1) "Alice"
2) "Bob"
1.3 典型应用场景
- 🔁 缓存:存储用户信息、商品详情等。
- 📊 计数器:页面浏览量、点赞数、库存扣减。
- 🔐 分布式锁:使用
SETNX
+EXPIRE
实现。 - 🧩 限流:结合
INCR
和EXPIRE
实现滑动窗口限流。
📌 二、Hash(哈希)—— 存储对象的理想选择
2.1 特点
- 类似于 Java 中的
Map<String, String>
。 - 适合存储一个对象的多个字段,避免“序列化大字符串”。
- 节省内存,支持对单个字段操作。
2.2 常用命令
# 1. 设置字段值
HSET user:1001 name "张三" age 30 email "zhangsan@example.com"
(integer) 3# 2. 获取单个字段
HGET user:1001 name
"张三"# 3. 获取所有字段和值
HGETALL user:1001
1) "name"
2) "张三"
3) "age"
4) "30"
5) "email"
6) "zhangsan@example.com"# 4. 获取所有字段名
HKEYS user:1001
1) "name"
2) "age"
3) "email"# 5. 获取所有值
HVALS user:1001
1) "张三"
2) "30"
3) "zhangsan@example.com"# 6. 字段值自增
HINCRBY user:1001 age 1
(integer) 31# 7. 判断字段是否存在
HEXISTS user:1001 phone
(integer) 0 # 不存在
2.3 典型应用场景
- 🧑 用户信息存储:将用户的不同属性作为字段存储。
- 🛒 购物车:
cart:用户ID
作为 key,商品 ID 为 field,数量为 value。 - 📦 配置项管理:系统配置、用户偏好设置。
💡 优势:更新某个字段时,无需读取整个对象再序列化写回,高效且节省带宽。
📌 三、List(列表)—— 双端操作的队列/栈
3.1 特点
- 有序(按插入顺序)、可重复。
- 支持从 头部(left) 和 尾部(right) 插入/弹出。
- 底层是双向链表,插入删除快,随机访问慢。
3.2 常用命令
# 1. 从右侧(尾部)插入
RPUSH tasks "send_email" "generate_report"
(integer) 2# 2. 从左侧(头部)插入
LPUSH news:top "头条新闻1" "头条新闻2"
(integer) 2# 3. 从左侧弹出(消费)
LPOP tasks
"send_email"# 4. 从右侧弹出
RPOP tasks
"generate_report"# 5. 查看范围内的元素(0 到 -1 表示全部)
LRANGE news:top 0 -1
1) "头条新闻2"
2) "头条新闻1"# 6. 获取列表长度
LLEN news:top
(integer) 2# 7. 阻塞式弹出(消息队列核心)
BLPOP queue:work 30 # 阻塞最多 30 秒
# 如果有元素,立即返回;否则等待或超时返回 nil
3.3 典型应用场景
- 📢 消息队列:使用
LPUSH
+BRPOP
实现简单的生产者-消费者模型。 - 📰 最新消息/动态:将最新动态
LPUSH
到列表,LRANGE
获取前 N 条。 - 🔁 栈/队列结构:实现 LIFO(后进先出)或 FIFO(先进先出)逻辑。
⚠️ 注意:List 不适合做“分页查询”,因为
LRANGE
是 O(N) 复杂度。
📌 四、Set(集合)—— 无序且唯一
4.1 特点
- 无序、元素不重复。
- 查询、插入、删除时间复杂度均为 O(1)。
- 支持交集、并集、差集等集合运算。
4.2 常用命令
# 1. 添加元素
SADD tags:1001 java python java # 重复的 java 不会添加
(integer) 2# 2. 查看所有元素
SMEMBERS tags:1001
1) "python"
2) "java"# 3. 判断元素是否存在
SISMEMBER tags:1001 go
(integer) 0 # 不存在# 4. 随机弹出一个元素
SPOP tags:1001
"java"# 5. 集合运算
SADD user:1:interests music movie sport
SADD user:2:interests movie reading sport# 求交集(共同兴趣)
SINTER user:1:interests user:2:interests
1) "movie"
2) "sport"# 求并集
SUNION user:1:interests user:2:interests
1) "music"
2) "movie"
3) "sport"
4) "reading"# 求差集(user1 有但 user2 没有的)
SDIFF user:1:interests user:2:interests
1) "music"
4.3 典型应用场景
- 🎯 标签系统:文章标签、用户兴趣标签。
- 👥 好友关系/关注列表:存储用户关注的人。
- 🔍 去重:如统计活跃用户 ID(使用
SADD
自动去重)。 - 🤝 社交推荐:通过交集计算“共同好友”、“共同兴趣”。
📌 五、ZSet(有序集合)—— 带权重的集合
5.1 特点
- 有序(按 分数 score 排序)、元素唯一。
- 分数可以重复,元素不能重复。
- 支持按分数范围查询、排名查询。
5.2 常用命令
# 1. 添加成员(分数在前)
ZADD leaderboard 100 "Alice" 150 "Bob" 90 "Charlie"
(integer) 3# 2. 按分数升序查看(0 到 -1 表示全部)
ZRANGE leaderboard 0 -1 WITHSCORES
1) "Charlie"
2) "90"
3) "Alice"
4) "100"
5) "Bob"
6) "150"# 3. 按分数降序查看
ZREVRANGE leaderboard 0 -1 WITHSCORES
1) "Bob"
2) "150"
3) "Alice"
4) "100"
5) "Charlie"
6) "90"# 4. 获取成员的分数
ZSCORE leaderboard "Alice"
"100"# 5. 获取成员排名(升序)
ZRANK leaderboard "Alice"
(integer) 1# 6. 获取成员逆序排名
ZREVRANK leaderboard "Alice"
(integer) 1# 7. 按分数范围查询
ZRANGEBYSCORE leaderboard 95 105 WITHSCORES
1) "Alice"
2) "100"# 8. 分数自增
ZINCRBY leaderboard 10 "Alice"
"110"
5.3 典型应用场景
- 🏆 排行榜:游戏积分、销售榜单、热门文章。
- 📅 延迟队列:将任务的执行时间戳作为 score,使用
ZRANGEBYSCORE
查询到期任务。 - 🕒 时间线:按时间戳排序的动态、日志。
- 📈 滑动窗口统计:结合
ZREMRANGEBYSCORE
实现。
✅ 总结对比表
数据结构 | 是否有序 | 是否允许重复 | 主要操作 | 典型用途 |
---|---|---|---|---|
String | 否 | 是 | SET/GET/INCR | 缓存、计数器、分布式锁 |
Hash | 否 | field 不重复 | HSET/HGET/HINCRBY | 对象存储、配置管理 |
List | 是(插入顺序) | 是 | LPUSH/RPUSH/LPOP/RPOP | 消息队列、最新列表 |
Set | 否 | 否 | SADD/SMEMBERS/SINTER | 标签、去重、共同好友 |
ZSet | 是(按 score) | member 不重复 | ZADD/ZRANGE/ZRANK | 排行榜、延迟队列 |
📚 推荐
- Redis 官方命令手册