MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第八章:Redis 高级应用

一、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。


思考题(精简回答)

  1. 为什么文章点赞功能使用 Set,而不是 List? 因为 Set 自动去重,可以保证一个用户只能点赞一次。List 允许重复,会出现同一个用户多次点赞的问题。

  2. 为什么排行榜必须使用 ZSet?
    因为排行榜需要:保存唯一用户、根据分数排序。ZSet 自带 Score 排序,可以快速获取排名。

  3. 用户签到为什么适合使用 Bitmap?
    因为签到数据通常只有两种状态:已签到、未签到。Bitmap 使用 bit 存储,占用空间小,适合大量用户签到记录。

  4. 最近浏览记录为什么适合使用 List?
    List有序、支持头部插入,新浏览的商品放前面,可以方便获取最近的浏览记录

  5. 购物车为什么通常使用 Hash?
    因为购物车是一个对象:商品ID → 数量 。Hash 可以单独修改某个商品数量,操作方便。

  6. Redis 发布订阅适合解决什么问题?
    适合消息广播场景,例如:实时通知、聊天消息、系统消息推送。一个消息可以被多个订阅者接收。

相关推荐
一只小菜鸡..9 小时前
南京大学 操作系统 (JYY) 学习笔记:文件系统实现——从 FAT、ext2 到现代 B-Tree 黑科技
笔记·科技·学习
深爱水瓶 血影S狂风9 小时前
Linux.NET学习手记(2)
linux·学习·.net
明明真系叻9 小时前
RAG学习(1)
学习·rag
春水碧于天,画船听雨眠9 小时前
LangChain学习笔记(一)
笔记·学习·langchain
zerwave9 小时前
Docker 学习:多容器网络互通——从 host 模式到自定义 bridge 网络
网络·学习·docker
Zzj_tju9 小时前
Instruction Tuning 论文精读路线:从 Supervised Fine-Tuning 到 Instruction Following
人工智能·笔记·学习·语言模型·自然语言处理
難釋懷9 小时前
Nginx外置缓存-redis2-nginx-module
nginx·缓存·junit
LearnYard9 小时前
Android存储空间清理策略对比:缓存识别与多种清理方案的技术分析
缓存·智能手机
j7~10 小时前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步
min(a,b)11 小时前
学习第10天:日志、测试、配置与容器化部署
学习