Redis 数据结构:五种常用类型和应用场景实战
前言
Redis 不只是简单的缓存,它有 5 种常用数据结构,每种都有特定的应用场景。用对了能解决很多问题,用错了就是浪费内存。本文讲清楚这 5 种数据结构。
一、String(字符串)
是什么
最简单的 key-value 结构,value 可以是字符串、数字、二进制。
常用命令
# 设置值
SET name "张三"
# 获取值
GET name
# 数字自增
INCR count
INCRBY count 10
# 设置过期时间
SETEX session:token 3600 "abc123"
# 批量操作
MSET name "张三" age 18 city "北京"
MGET name age city
应用场景
- 缓存:缓存用户信息、配置
- 计数器:文章阅读数、点赞数
- 分布式锁:SETNX 命令
- Session 存储:用户登录状态
二、Hash(哈希)
是什么
一个 key 对应一个 map,适合存储对象。
常用命令
# 设置单个字段
HSET user:1 name "张三"
HSET user:1 age 18
# 获取单个字段
HGET user:1 name
# 获取所有字段
HGETALL user:1
# 批量设置
HMSET user:1 name "张三" age 18 city "北京"
# 字段自增
HINCRBY user:1 age 1
应用场景
- 存储对象:用户信息、商品信息
- 购物车:key 是用户 ID,field 是商品 ID,value 是数量
# 购物车
HSET cart:1001 商品A 2
HSET cart:1001 商品B 1
三、List(列表)
是什么
有序列表,底层是双向链表,可以从左右两边 push/pop。
常用命令
# 左边插入
LPUSH messages "hello"
LPUSH messages "world"
# 右边插入
RPUSH messages "end"
# 左边弹出
LPOP messages
# 右边弹出
RPOP messages
# 查看列表范围
LRANGE messages 0 -1
# 列表长度
LLEN messages
应用场景
- 消息队列:LPUSH + RPOP
- 最新消息:比如最新评论、最新文章
- 朋友圈时间线:LPUSH 新内容,LRANGE 分页查看
四、Set(集合)
是什么
无序且不重复的集合,自动去重。
常用命令
# 添加元素
SADD tags "PHP" "MySQL" "Redis"
# 查看所有元素
SMEMBERS tags
# 判断元素是否存在
SISMEMBER tags "PHP"
# 集合运算
SINTER set1 set2 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集
# 集合大小
SCARD tags
应用场景
- 标签系统:一篇文章的标签
- 共同好友:SINTER 算交集
- 去重:UV 统计、防止重复提交
- 抽奖:SRANDMEMBER 随机抽取
五、ZSet(有序集合)
是什么
每个元素都有一个 score,按 score 排序,不重复。
常用命令
# 添加元素
ZADD rank 100 "张三"
ZADD rank 90 "李四"
ZADD rank 95 "王五"
# 按分数从低到高排序
ZRANGE rank 0 -1 WITHSCORES
# 按分数从高到低排序
ZREVRANGE rank 0 -1 WITHSCORES
# 查看元素排名
ZREVRANK rank "张三"
# 查看元素分数
ZSCORE rank "张三"
# 分数范围查询
ZRANGEBYSCORE rank 90 100
应用场景
- 排行榜:直播间送礼排行、游戏排行
- 延迟队列:score 存时间戳,到点的任务处理
- 加权排序:搜索结果排序
六、怎么选数据结构
| 场景 | 用什么 |
|---|---|
| 简单 key-value | String |
| 存对象 | Hash |
| 有序列表/队列 | List |
| 去重/标签 | Set |
| 排序/排行 | ZSet |
七、常见坑
- List 太多元素:链表太长,范围查询慢
- Hash 字段太多:小对象还好,大对象不适合
- Set 当 List 用:Set 无序,要顺序用 List 或 ZSet
- 大 key:一个 key 存几百万数据,会阻塞
总结
Redis 5 种数据结构的核心要点:
- String:最简单,缓存、计数器
- Hash:存对象,用户信息、购物车
- List:有序队列,消息、时间线
- Set:去重集合,标签、共同好友
- ZSet:排序集合,排行榜、延迟队列
选对数据结构,Redis 才能发挥最大威力。