一、Redis 实现点赞功能 ⭐⭐⭐⭐⭐
业务需求
文章:
文章ID:100
用户:
用户1
用户2
要求:
- 用户只能点赞一次
- 可以取消点赞
- 查询点赞人数
Redis 设计
使用 Set:
article:like:100
保存:
user:1
user:2
user:3
点赞
SADD article:like:100 user:1
取消点赞
SREM article:like:100 user:1
判断是否点赞
SISMEMBER article:like:100 user:1
获取点赞数量
SCARD article:like:100
为什么不用 MySQL?
如果点赞非常频繁:
100万人点赞
每次:
INSERT
DELETE
数据库压力大。
Redis:
内存操作速度快。
二、Redis 实现排行榜 ⭐⭐⭐⭐⭐
场景
例如:
游戏积分:
玩家A 1000分
玩家B 900分
玩家C 800分
使用 ZSet
Key:
game:rank
数据:
A 1000
B 900
C 800
Score:
就是排名依据。
添加分数
ZADD game:rank 1000 A
增加积分
ZINCRBY game:rank 100 A
查询排行榜
前三名:
ZREVRANGE game:rank 0 2
获取排名
ZREVRANK game:rank A
三、Redis 实现签到功能 ⭐⭐⭐⭐
场景
用户每天签到。
例如:
用户1001
2026-07-15 已签到
方案一:Bitmap(位图)
Redis 提供:
Bitmap
用一个 Bit 表示签到状态。
例如:
日期:
1 2 3 4 5
签到:
1 0 1 1 0
表示:
1、3、4号签到。
命令
签到:
SETBIT sign:1001 15 1
查询:
GETBIT sign:1001 15
优点
非常节省空间。
适合:
大量用户签到。
四、Redis 实现最近浏览记录 ⭐⭐⭐⭐
场景
用户最近看过:
商品A
商品B
商品C
要求:
- 保持顺序
- 新浏览放前面
- 控制数量
使用 List
Key:
history:user:1001
添加:
LPUSH history:user:1001 product:1
查看:
LRANGE history:user:1001 0 9
保存最近10条。
五、Redis 发布订阅(Pub/Sub)
什么是发布订阅?
一个服务发布消息。
多个服务接收。
结构:
发布者
↓
Redis Channel
↓
订阅者
示例
发布:
PUBLISH news hello
订阅:
SUBSCRIBE news
应用场景
- 实时通知
- 聊天系统
- 消息广播
六、Redis 实现验证码
场景:
手机验证码:
138xxxx
验证码:
123456
Redis:
phone:code:138xxxx
Value:
123456
TTL:
5分钟
七、Redis 实现购物车
购物车:
用户1001
商品1 数量2
商品2 数量3
推荐:
Hash。
Key:
cart:user:1001
字段:
product:1 → 2
product:2 → 3
八、常见业务与 Redis 对应关系
| 业务 | Redis结构 |
|---|---|
| 缓存对象 | String / Hash |
| 用户Token | String |
| 点赞 | Set |
| 收藏 | Set |
| 排行榜 | ZSet |
| 签到 | Bitmap |
| 购物车 | Hash |
| 浏览记录 | List |
| 消息广播 | Pub/Sub |
九、本章总结
Redis 不只是缓存。
它还能作为:
- 高性能计数器
- 排行系统
- 用户关系系统
- 临时数据存储
- 消息通信工具
本章一句话总结
Redis 的价值在于利用不同数据结构解决不同业务问题,而不是简单存 Key-Value。
思考题(精简回答)
-
为什么文章点赞功能使用 Set,而不是 List? 因为 Set 自动去重,可以保证一个用户只能点赞一次。List 允许重复,会出现同一个用户多次点赞的问题。
-
为什么排行榜必须使用 ZSet?
因为排行榜需要:保存唯一用户、根据分数排序。ZSet 自带 Score 排序,可以快速获取排名。 -
用户签到为什么适合使用 Bitmap?
因为签到数据通常只有两种状态:已签到、未签到。Bitmap 使用 bit 存储,占用空间小,适合大量用户签到记录。 -
最近浏览记录为什么适合使用 List?
List有序、支持头部插入,新浏览的商品放前面,可以方便获取最近的浏览记录 -
购物车为什么通常使用 Hash?
因为购物车是一个对象:商品ID → 数量 。Hash 可以单独修改某个商品数量,操作方便。 -
Redis 发布订阅适合解决什么问题?
适合消息广播场景,例如:实时通知、聊天消息、系统消息推送。一个消息可以被多个订阅者接收。