第 2 课:Redis 核心数据结构详解
学习目标
完成本课后,你将掌握:
- Redis 五大核心数据结构
- 各数据结构的底层特点
- 常用命令操作
- 项目中的典型应用场景
- 如何选择合适的数据结构解决业务问题
Redis 五大核心数据结构
Redis 支持 5 种核心数据结构。
这也是 Redis 区别于传统 Key-Value 数据库的重要原因。
| 数据结构 | 中文名称 | 特点 |
|---|---|---|
| String | 字符串 | 最基础、最常用 |
| Hash | 哈希 | 存储对象 |
| List | 列表 | 有序可重复 |
| Set | 集合 | 无序不重复 |
| ZSet | 有序集合 | 自动排序 |
2.1 String(字符串)
什么是 String?
String 是 Redis 最基础的数据结构。
特点:
- 二进制安全
- 可以存储任意数据
- 最大支持 512MB
- 操作效率极高
可以存储:
- 字符串
- 数字
- JSON
- 图片二进制
- 文件二进制
常用命令
设置数据
set key value
示例:
set name zhangsan
获取数据
get key
示例:
get name
批量设置
mset key1 value1 key2 value2
示例:
mset name zhangsan age 20 city beijing
批量获取
mget key1 key2
示例:
mget name age
自增
incr count
示例:
set count 1
incr count
结果:
2
自减
decr count
指定数值增加
incrby count 10
指定数值减少
decrby count 10
不存在才设置
setnx key value
示例:
setnx lock 1
常用于:
- 分布式锁
String 应用场景
缓存用户信息
set user:1001 "{json数据}"
文章阅读量
incr article:1001:view
点赞数
incr article:1001:like
验证码
setex sms:13800138000 300 123456
分布式锁
setnx lock:order 1
面试题
为什么 Redis 计数器不会超卖?
因为:
INCR
DECR
都是原子操作。
Redis 单线程执行命令。
不会出现并发安全问题。
2.2 Hash(哈希)
什么是 Hash?
Hash 本质上是:
key -> field -> value
类似 Java 中:
Map<String,Object>
非常适合存储对象。
数据结构示意
user:1001
├─ name = zhangsan
├─ age = 20
└─ gender = male
常用命令
设置字段
hset user:1001 name "zhangsan" age 20 gender "male"
获取字段
hget user:1001 name
获取全部字段
hgetall user:1001
获取所有 Key
hkeys user:1001
获取所有 Value
hvals user:1001
字段自增
hincrby user:1001 age 1
判断字段是否存在
hexists user:1001 name
删除字段
hdel user:1001 age
获取字段数量
hlen user:1001
Hash 应用场景
用户信息
user:1001
保存:
- 姓名
- 年龄
- 手机号
- 邮箱
商品详情
product:1001
保存:
- 名称
- 价格
- 库存
系统配置
system:config
保存:
- 网站名称
- Logo
- 联系方式
购物车
cart:1001
商品ID -> 数量
例如:
hset cart:1001 10001 2
hset cart:1001 10002 5
Hash 与 String 对比
| 对比项 | String | Hash |
|---|---|---|
| 存储对象 | 一般 | 优秀 |
| 更新单个字段 | 需要整体更新 | 直接更新 |
| 内存占用 | 较高 | 较低 |
| 推荐程度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
2.3 List(列表)
什么是 List?
List 是一个:
有序
可重复
的字符串列表。
底层实现:
双向链表
常用命令
左侧插入
lpush list1 "a" "b" "c"
结果:
c b a
右侧插入
rpush list1 "d" "e"
结果:
c b a d e
左侧弹出
lpop list1
返回:
c
右侧弹出
rpop list1
返回:
e
获取元素
lrange list1 0 -1
获取全部元素。
获取前几个元素
lrange list1 0 2
获取长度
llen list1
阻塞获取
blpop list1 30
brpop list1 30
List 应用场景
消息队列
生产者:
lpush queue msg1
消费者:
rpop queue
最新文章
latest:article
最新评论
latest:comment
浏览记录
history:user:1001
栈结构
lpush
lpop
2.4 Set(集合)
什么是 Set?
特点:
无序
不重复
底层:
Hash Table
常用命令
添加元素
sadd set1 "a" "b" "c" "a"
结果:
a b c
自动去重。
获取所有元素
smembers set1
判断是否存在
sismember set1 "a"
删除元素
srem set1 "b"
获取数量
scard set1
集合运算
交集
sinter set1 set2
并集
sunion set1 set2
差集
sdiff set1 set2
Set 应用场景
用户标签
tag:user:1001
商品标签
tag:product:1001
共同好友
sinter friend:user1 friend:user2
网站 UV 去重
sadd uv:20260501 ip
抽奖系统
利用:
spop
随机抽取。
2.5 ZSet(有序集合)
什么是 ZSet?
ZSet:
有序
不重复
每个元素都有:
score
Redis 会根据 score 自动排序。
数据结构示意
100 zhangsan
90 lisi
80 wangwu
常用命令
添加元素
zadd rank 100 "zhangsan" 90 "lisi" 80 "wangwu"
升序查询
zrange rank 0 -1
降序查询
zrevrange rank 0 -1
查询排名
zrank rank "lisi"
查询分数
zscore rank "zhangsan"
增加分数
zincrby rank 10 "lisi"
删除元素
zrem rank "wangwu"
分数范围查询
zrangebyscore rank 80 90
ZSet 应用场景
游戏排行榜
game:rank
商品销量榜
product:sale:rank
热搜榜
hot:search
延时队列
score = 时间戳
定时任务
score = 执行时间
五大数据结构选型总结
| 场景 | 推荐结构 |
|---|---|
| 缓存对象 | Hash |
| 计数器 | String |
| 消息队列 | List |
| 去重 | Set |
| 标签系统 | Set |
| 排行榜 | ZSet |
| 延时任务 | ZSet |
| 浏览记录 | List |
| 用户信息 | Hash |
| 验证码 | String |
本课总结
本课学习了 Redis 五大核心数据结构:
- String
- Hash
- List
- Set
- ZSet
掌握这五种数据结构后,已经能够解决 80% 以上的 Redis 项目场景。
课后练习
练习 1
使用 Hash 存储用户信息:
姓名
年龄
性别
邮箱
手机号
练习 2
使用 List 实现消息队列:
生产者:LPUSH
消费者:RPOP
练习 3
使用 ZSet 实现学生成绩排行榜:
- 添加成绩
- 查询排名
- 修改成绩
练习 4
使用 Set 实现标签系统:
- 添加标签
- 删除标签
- 查询标签
- 查询共同标签
下一课预告
第 3 课:Java 客户端操作 Redis
学习内容:
- Jedis
- Lettuce
- Spring Data Redis
- RedisTemplate
- Spring Boot 整合 Redis
- Redis 工具类封装
- 企业级项目实战