MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第二章:Redis 五大数据结构
·
一、Redis 五大数据结构
| 数据结构 | 特点 | 企业场景 |
|---|---|---|
| String | 字符串,最常用 | 缓存、Token、验证码 |
| Hash | 键值对集合 | 用户信息、商品信息 |
| List | 有序列表,可重复 | 消息队列、聊天记录 |
| Set | 无序集合,不重复 | 点赞、标签、好友关系 |
| ZSet(Sorted Set) | 有序集合,可排序 | 排行榜、积分榜、热搜榜 |
企业中 80% 左右的场景都是 String 和 Hash。
二、String(字符串)⭐⭐⭐⭐⭐
特点
- 最基本的数据类型
- 一个 Key 对应一个 Value
- Value 可以是字符串、数字、JSON 等
例如:
user:name → Tom
count → 100
token:1 → xxxxx
常用命令
设置:
SET name Tom
获取:
GET name
删除:
DEL name
设置过期时间:
SET token abc EX 3600
数字自增:
INCR count
数字自减:
DECR count
企业应用
- Token
- 验证码
- 商品缓存
- 文章内容缓存
- 访问计数
三、Hash(哈希)⭐⭐⭐⭐⭐
特点
一个 Key 对应多个字段。
例如:
user:1
username → Tom
age → 20
email → tom@test.com
不像 String 保存整个 JSON,而是可以单独修改某个字段。
常用命令
新增字段:
HSET user:1 username Tom
获取字段:
HGET user:1 username
获取所有字段:
HGETALL user:1
删除字段:
HDEL user:1 age
企业应用
- 用户信息
- 商品信息
- 系统配置
四、List(列表)⭐⭐⭐⭐
特点
- 有序
- 可重复
- 两端都可以插入和删除
例如:
A
B
C
常用命令
左侧插入:
LPUSH msg hello
右侧插入:
RPUSH msg world
左侧取出:
LPOP msg
右侧取出:
RPOP msg
查看全部:
LRANGE msg 0 -1
企业应用
- 消息队列(简单)
- 聊天记录
- 最近浏览记录
五、Set(集合)⭐⭐⭐⭐⭐
特点
- 无序
- 元素唯一
- 自动去重
例如:
Tom
Jack
Lucy
如果再次添加:
Tom
不会重复。
常用命令
添加:
SADD like:1 user1
查看:
SMEMBERS like:1
判断是否存在:
SISMEMBER like:1 user1
删除:
SREM like:1 user1
统计数量:
SCARD like:1
企业应用
- 点赞
- 收藏
- 标签
- 好友关系
六、ZSet(Sorted Set)⭐⭐⭐⭐⭐
特点
- 元素唯一
- 自动排序
- 每个元素都有一个分数(Score)
例如:
Tom 100
Jack 95
Lucy 80
Redis 会自动按 Score 排序。
常用命令
添加:
ZADD rank 100 Tom
查看排行榜:
ZRANGE rank 0 -1
倒序查看:
ZREVRANGE rank 0 -1
增加分数:
ZINCRBY rank 10 Tom
查看排名:
ZREVRANK rank Tom
企业应用
- 游戏排行榜
- 销量排行榜
- 热搜榜
- 积分榜
七、如何选择数据结构?
| 需求 | 推荐数据结构 |
|---|---|
| 一个值 | String |
| 一个对象 | Hash |
| 有顺序列表 | List |
| 去重集合 | Set |
| 排序集合 | ZSet |
八、企业案例
用户信息
user:1
推荐:
Hash
Token
token:123456
推荐:
String
商品排行榜
product:rank
推荐:
ZSet
文章点赞用户
article:1:like
推荐:
Set
最新消息
message:list
推荐:
List
九、本章总结
| 数据结构 | 是否有序 | 是否可重复 | 典型场景 |
|---|---|---|---|
| String | × | √ | 缓存、Token |
| Hash | × | 字段唯一 | 用户信息 |
| List | √ | √ | 消息队列、聊天 |
| Set | × | × | 点赞、标签 |
| ZSet | √(按 Score) | × | 排行榜 |
本章一句话总结
Redis 的核心不是命令,而是根据业务场景选择合适的数据结构。
思考题(精简回答即可)
- 为什么用户信息更适合使用 Hash,而不是一个 JSON 字符串(String)?
Hash 可以单独修改某个字段,例如只修改
age,不用重新保存整个对象。JSON String 每次修改一个字段,都需要读取整个 JSON,再重新写入 - List 和 Set 都能存多个元素,它们最大的区别是什么?
List:有序、允许重复
Set:无序、不允许重复 - 为什么点赞功能通常使用 Set,而不是 List?
因为点赞要求:同一个用户只能点赞一次、自动去重,Set 可以保证唯一性。 - 排行榜为什么必须使用 ZSet,而不是 Set?
因为排行榜需要:元素唯一、根据分数排序,Set只能存数据,不能记录排名 - Token、验证码为什么通常使用 String?
因为 Token 和验证码通常是:一个 Key 对应一个值。
- 如果要实现"最近浏览商品记录",你会选择哪种数据结构?为什么?
使用 List。原因:最近浏览需要:保持浏览顺序、新浏览商品放前面、可以限制数量
更多推荐
所有评论(0)