一、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 80Redis 会自动按 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推荐:
HashToken
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。原因:最近浏览需要:保持浏览顺序、新浏览商品放前面、可以限制数量