当前位置: 首页 > ds >正文

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 实现。
  • 🧩 限流:结合 INCREXPIRE 实现滑动窗口限流。

📌 二、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 实现。

✅ 总结对比表

数据结构是否有序是否允许重复主要操作典型用途
StringSET/GET/INCR缓存、计数器、分布式锁
Hashfield 不重复HSET/HGET/HINCRBY对象存储、配置管理
List是(插入顺序)LPUSH/RPUSH/LPOP/RPOP消息队列、最新列表
SetSADD/SMEMBERS/SINTER标签、去重、共同好友
ZSet是(按 score)member 不重复ZADD/ZRANGE/ZRANK排行榜、延迟队列

📚 推荐

  • Redis 官方命令手册
http://www.xdnf.cn/news/17874.html

相关文章:

  • Qwen-Image(阿里通义千问)技术浅析(二)
  • HTTP 协议详细介绍
  • 第6章 AB实验的SRM问题
  • elasticsearch mapping和template解析(自动分词)!
  • 何解决PyCharm中pip install安装Python报错ModuleNotFoundError: No module named ‘json’问题
  • Flink DataStream 按分钟或日期统计数据量
  • 如何在VS里使用MySQL提供的mysql Connector/C++的debug版本
  • LeetCode 刷题【40. 组合总和 II】
  • 基于C#、.net、asp.net的心理健康咨询系统设计与实现/心理辅导系统设计与实现
  • 药房智能盘库系统的Python编程分析与实现—基于计算机视觉与时间序列预测的智能库存管理方案
  • Redis学习——Redis的十大类型String、List、Hash、Set、Zset
  • 仓库无人叉车的安全功能有哪些?如何在提升效率时保障安全?
  • 机器学习——svm支持向量机
  • 为什么要使用消息队列呢?
  • 【龙泽科技】汽车故障诊断仿真教学软件【科鲁兹】
  • 总经理掌舵研发团队:在技术突破与商业落地间找到平衡的艺术-中小企实战运营和营销工作室博客
  • 力扣 hot100 Day72
  • Gradle(二)Gradle的优势、项目结构介绍
  • LINUX812 shell脚本:if else,for 判断素数,创建用户
  • Spring Boot项目中调用第三方接口
  • B站 韩顺平 笔记 (Day 16)
  • 终端安全与网络威胁防护笔记
  • 秋招笔记-8.12
  • Web 安全之互联网暴露面管理
  • 计算机网络2-3:传输方式
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记:UART Controller,通用异步收发传输器控制器
  • C语言中关于普通变量和指针变量、结构体包含子结构体或包含结构体指针的一些思考
  • windows单机单卡+CIFAR-10数据集+Docker模拟训练
  • 一键设置 NTP 时区的脚本(亲测,适用于部署 K8S 的前置环境)
  • http网页部署