🎯 一句话定位:从零搭建 Redis 环境到落地 10 大业务场景的一站式实战手册
💡 核心理念:Redis 不只是缓存,它是解决高并发、分布式协调、实时计算等问题的瑞士军刀
📖 3分钟速览版
📊 点击展开核心概念和快速参考
🔌 Redis 10 大业务场景全景图
graph TD
subgraph 数据加速
A[缓存] --> |String/Hash| A1[降低 DB 压力]
B[计数器] --> |INCR| B1[点赞/播放量]
end
subgraph 业务功能
C[排行榜] --> |Sorted Set| C1[销量/积分榜]
D[抽奖] --> |SPOP| D1[随机抽取]
E[签到] --> |Bitmap| E1[连续签到]
F[最新列表] --> |List| F1[动态/消息流]
end
subgraph 分布式协调
G[分布式锁] --> |SETNX| G1[秒杀/减库存]
H[分布式会话] --> |Hash| H1[Session 共享]
end
subgraph 流控与消息
I[限流] --> |INCR+EXPIRE| I1[API 限速]
J[消息队列] --> |List/Stream| J1[异步解耦]
end
style A fill:#e3f2fd
style C fill:#e3f2fd
style G fill:#fff3e0
style I fill:#fff3e0
style B fill:#c8e6c9
style D fill:#c8e6c9
style E fill:#f3e5f5
style F fill:#f3e5f5
style H fill:#fff3e0
style J fill:#f3e5f5
📋 常用命令速查
| 操作 | 命令 | 说明 |
|---|---|---|
| 启动服务 | redis-server |
前台启动 |
| 后台启动 | redis-server --daemonize yes |
守护进程模式 |
| 连接客户端 | redis-cli |
默认 127.0.0.1:6379 |
| 认证 | AUTH <password> |
有密码时需要 |
| 设置缓存 | SET key value EX 60 |
60 秒过期 |
| 自增计数 | INCR key |
原子自增 |
| 排行榜加分 | ZADD rank 100 user1 |
添加/更新分数 |
| 分布式锁 | SET lock val NX EX 10 |
不存在时设置,10 秒过期 |
| 队列写入 | LPUSH queue msg |
左侧入队 |
| 队列消费 | RPOP queue |
右侧出队 |
🎯 业务场景选择指南
| 场景 | 推荐数据结构 | 核心命令 | 复杂度 |
|---|---|---|---|
| 缓存 | String / Hash | GET/SET/HGETALL | 低 |
| 排行榜 | Sorted Set | ZADD/ZREVRANGE | 中 |
| 计数器 | String / Hash | INCR/HINCRBY | 低 |
| 限流 | String | INCR + EXPIRE | 低 |
| 分布式会话 | Hash | HSET/HGETALL | 中 |
| 分布式锁 | String | SET NX EX | 中 |
| 消息队列 | List / Stream | LPUSH/RPOP/XADD | 高 |
| 抽奖 | Set | SADD/SPOP | 低 |
| 签到 | Bitmap | SETBIT/BITCOUNT | 中 |
| 最新列表 | List | LPUSH/LRANGE | 低 |
🧠 深度剖析版
1. Redis 安装
1.1 macOS 安装(Homebrew)
如果未安装 Homebrew,先执行以下命令:
1 | /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" |
安装 Redis:
1 | brew install redis@6.2.6 # @后可指定版本 |
启动 / 停止 / 重启服务:
1 | 启动 Redis 服务 |
设置开机启动:
1 | ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents |
卸载 Redis:
1 | brew uninstall redis |
1.2 Linux 安装(apt / yum)
Ubuntu / Debian:
1 | 更新包索引并安装 |
CentOS / RHEL:
1 | 安装 EPEL 仓库(CentOS 7) |
验证安装成功:
1 | redis-cli ping |
1.3 Docker 安装
快速启动(适合开发测试):
1 | 拉取官方镜像并启动 |
生产环境推荐配置:
1 | 带密码和持久化的启动方式 |
使用 Docker Compose:
1 | # docker-compose.yml |
1 | docker compose up -d |
2. Redis 常用命令
2.1 服务管理
1 | 使用配置文件启动 redis-server |
2.2 常用数据操作
1 | ---- String ---- |
3. Redis 配置详解
3.1 配置文件位置
| 安装方式 | 配置文件路径 |
|---|---|
| macOS Homebrew | /usr/local/etc/redis.conf |
| Ubuntu apt | /etc/redis/redis.conf |
| CentOS yum | /etc/redis.conf |
| Docker | 挂载自定义 redis.conf |
3.2 关键配置项
1 | # 绑定地址(生产环境不要用 0.0.0.0) |
3.3 配置验证
1 | 进入 redis-cli 后查看配置 |
4. SpringBoot 整合 Redis
4.1 添加依赖
1 | <dependency> |
4.2 application.yml 配置
1 | spring: |
4.3 Redis 配置类
1 |
|
4.4 RedisTemplate 常用操作
1 |
|
5. Redis 10 大业务场景实战
5.1 缓存
缓存是 Redis 最经典的使用场景,将热点数据存入 Redis 以降低数据库压力。
要点:
- 不同对象的 key 不能重复,推荐
类名:主键格式 - 选择合适的序列化方式,减少内存占用
- 缓存内容需与数据库保持一致(缓存更新策略)
1 | // 缓存读取模式(Cache-Aside) |
5.2 排行榜
利用 Sorted Set 天然的排序能力实现各类排行榜,如销量榜、积分榜。
1 | 添加用户分数 |
1 | // SpringBoot 排行榜示例 |
5.3 计数器
Redis 的 INCR 命令天然具有原子性,非常适合点赞、阅读数、播放量等计数场景。先写入 Redis 再定时同步数据库,充分发挥高读写特性。
1 | 文章阅读量自增 |
微博动态四维计数(Hash 方案):
1 | 初始化微博计数 |
每日注册用户计数:
1 | 设置当天计数器,0 点过期 |
5.4 限流
以访问者的 IP 或用户 ID 作为 key,每次访问计数加一,超出阈值则拒绝请求。
1 | 简单限流:每分钟最多 100 次请求 |
1 | // SpringBoot 简单限流示例 |
5.5 分布式会话
集群模式下,应用较少时可使用容器自带的 Session 复制功能;应用增多时,搭建以 Redis 为中心的 Session 服务,Session 不再由容器管理。
Spring Session + Redis 方案:
1 | <dependency> |
1 | spring: |
1 | // 启用 Redis Session |
配置完成后,HttpSession 自动存储在 Redis 中,多个应用实例共享同一份 Session 数据。
5.6 分布式锁
对同一资源的并发访问(全局 ID 生成、减库存、秒杀等场景),利用 Redis 的 SETNX 功能实现互斥锁。
SET 命令参数说明:
EX:设置键的过期时间(单位为秒)PX:设置键的过期时间(单位为毫秒)NX:只在键不存在时,才对键进行设置操作XX:只在键已经存在时,才对键进行设置操作
Redis 命令方式:
1 | 加锁(NX 保证互斥,EX 防止死锁) |
生产环境推荐使用 Redisson:
1 | // Redisson 分布式锁示例 |
5.7 消息队列
Redis List 是双向链表,生产者 LPUSH 消息,消费者 RPOP 消费。需要优先级可使用 Sorted Set,需要持久化和消费组可使用 Stream(Redis 5.0+)。
1 | ---- List 简单队列 ---- |
5.8 抽奖
Redis Set 的 SPOP 命令可以随机移除并返回一个或多个元素,天然适合抽奖场景。
1 | 添加参与抽奖的用户 |
5.9 签到
利用 Bitmap 实现签到功能,每个用户每月仅需 4 字节即可记录整月签到状态,极其节省内存。
1 | 用户 1001 在 2023 年 2 月第 17 天签到(offset 从 0 开始,第 17 天 = offset 16) |
5.10 显示最新的项目列表
利用 List 的 LPUSH 和 LRANGE 实现,新数据始终在列表头部,适合”最新动态”类场景。
1 | 新消息入列表头部 |
1 | // SpringBoot 最新列表示例 |
💬 常见问题(FAQ)
Q1: Redis 为什么这么快?
A: Redis 的高性能主要来自三个方面:
- 纯内存操作:数据存储在内存中,读写速度极快
- 单线程模型:避免了多线程上下文切换和锁竞争的开销
- IO 多路复用:使用 epoll/kqueue 等机制,单线程即可处理大量并发连接
官方基准:单实例 QPS 可达 10 万+。
Q2: 缓存穿透、缓存击穿、缓存雪崩怎么解决?
A:
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 缓存穿透 | 大量请求查询不存在的 key,直接打到 DB | 布隆过滤器 / 缓存空值(短过期时间) |
| 缓存击穿 | 热点 key 过期瞬间,大量请求涌入 DB | 互斥锁(SETNX) / 热点 key 永不过期 |
| 缓存雪崩 | 大量 key 同时过期,DB 压力骤增 | 过期时间加随机值 / 多级缓存 / 限流降级 |
Q3: Redis 持久化选 RDB 还是 AOF?
A: 根据场景选择:
- RDB:定时快照,恢复速度快,但可能丢失最后一次快照后的数据。适合灾难恢复和备份
- AOF:记录每条写命令,数据更安全(最多丢失 1 秒数据),但文件较大。适合数据安全要求高的场景
- 推荐:两者同时开启。Redis 重启时优先用 AOF 恢复(数据更完整)
Q4: Redis 内存满了怎么办?
A: 配置 maxmemory 和淘汰策略:
- 先确认是否有不合理的大 key:
redis-cli --bigkeys - 设置合理的
maxmemory值(物理内存的 70-80%) - 选择合适的淘汰策略:
- 纯缓存场景:
allkeys-lru(淘汰最近最少使用的 key) - 缓存 + 持久化混合:
volatile-lru(只淘汰设置了过期时间的 key) - 不允许丢数据:
noeviction(写入直接报错)
- 纯缓存场景:
Q5: 什么时候不该用 Redis?
A: 以下场景 Redis 并非最佳选择:
- 数据量超过内存:Redis 是内存数据库,数据量远大于可用内存时成本过高
- 复杂查询:需要 JOIN、聚合等复杂 SQL 操作,关系型数据库更合适
- 强事务需求:Redis 事务不支持回滚,对事务一致性要求极高的场景应使用 RDBMS
- 冷数据存储:访问频率极低的数据放 Redis 浪费内存资源
- 大 Value 场景:单个 value 超过 10KB 时性能下降明显,超过 1MB 应考虑其他方案
✨ 总结
核心要点
- 安装灵活:Homebrew(macOS)、apt/yum(Linux)、Docker 三种方式覆盖主流环境
- 配置关键项:
maxmemory、requirepass、maxmemory-policy是生产环境必须关注的配置 - SpringBoot 整合:RedisTemplate 提供了完整的数据操作 API,配合 JSON 序列化提升可读性
- 场景丰富:10 大业务场景覆盖缓存、分布式协调、实时计算等核心需求
行动建议
- 入门阶段:先掌握安装配置和 5 种基础数据结构的 CRUD 命令
- 项目实战:从缓存场景切入,逐步引入分布式锁、限流等高级用法
- 生产部署:务必设置密码、配置持久化策略、限制最大内存,并做好监控
更新记录
| 版本 | 日期 | 说明 |
|---|---|---|
| v1.0 | 2023-02-17 | 初始版本 |
| v1.1 | 2026-03-11 | 优化文档结构,扩充安装方式和场景示例,添加 FAQ |