一、Redis简介
Redis 是开源、高性能的内存型 Key-Value NoSQL 数据库,主打基于内存读写,速度极快;
不只是简单缓存,还支持字符串、Hash、List、Set、有序 ZSet、Geo、位图等多种复杂数据结构,同时支持数据持久化、主从复制、哨兵、集群,可做高可用、分布式部署。
一句话总结:跑得飞快、数据结构丰富、能存内存也能落硬盘、适合高并发场景的中间件数据库。
1、Redis 核心优势
- 全内存操作,毫秒级读写,远超 MySQL 磁盘库;
- 单线程模型,无锁竞争,并发性能强;
- 数据结构多,能搞定复杂业务;
- 可持久化,断电 / 重启数据不丢失;
- 天然支持分布式、高可用、扩容。
2、Redis 能解决什么实际业务问题
1. 热点数据缓存(最常用)
痛点:MySQL 磁盘读写慢,首页、商品详情、用户信息频繁查库,数据库容易被打垮。
解决:把热点数据放 Redis,请求先查缓存,命中直接返回,减轻数据库压力、接口秒级响应。
2. 分布式 Session / 登录令牌存储
痛点:多服务器部署,登录会话存在单台机器,切换服务就掉线。
解决:Session、JWT 令牌统一存 Redis,所有服务共享,实现分布式登录、单点登录。
3. 接口限流 & 防刷
痛点:爬虫恶意刷接口、短信验证码重复频繁发送、秒杀恶意请求。
解决:利用 Redis 过期时间 + 计数器,实现IP 限流、接口限流、短信频次限制。
4. 分布式锁
痛点:多服务并发操作同一资源(秒杀减库存、订单创建),出现超卖、数据错乱。
解决:用 Redis 实现分布式锁,保证同一时刻只有一个业务操作资源,解决并发竞争问题。
5. 排行榜 / 有序榜单
痛点:MySQL 做积分、热度、直播间排行,排序分页性能极差。
解决:Redis ZSet 有序集合,天然自带排序,轻松做热搜榜、积分排行、直播间榜单。
6. 计数器实时统计
痛点:文章阅读量、点赞、粉丝数频繁更新数据库,压力大。
解决:Redis 原子自增命令,实时计数、高性能无压力。
7. 简易消息队列
痛点:下单发短信、日志记录等同步执行拖慢接口。
解决:用 Redis List 做简易队列,异步解耦、削峰填谷。
复杂可靠业务建议用 RabbitMQ/Kafka,Redis 适合轻量异步。
8. 地理位置查询
痛点:附近的人、附近门店,MySQL 计算距离又慢又复杂。
解决:Redis Geo 类型,快速实现同城匹配、附近门店查找。
9. 解决缓存穿透 / 击穿 / 雪崩
痛点:查不存在数据、热点缓存过期、缓存大面积失效,全部打垮数据库。
解决:配合 Redis 做布隆过滤器、互斥锁、缓存预热、过期时间打散,保护数据库。
3、什么时候不用 Redis
- 海量冷数据长期存储(内存成本高,用 MySQL / 对象存储);
- 强事务、强一致性核心业务(Redis 不适合替代 MySQL 做主事务库);
- 只存简单静态不常访问的数据。
二、Redis 应用-常用 13 大应用方案(实战落地版)
1、基础缓存类方案
-
通用缓存方案(Cache-Aside)
痛点:MySQL 磁盘查询慢、高并发下数据库压力爆炸
**方案:**请求先查 Redis 缓存 → 命中直接返回;未命中查 MySQL → 回写 Redis → 返回数据。
适用:商品详情、首页热点、系统字典、配置参数、用户基础信息。
-
Hash 结构化缓存方案
痛点:用户 / 商品多字段用 String 存储冗余,改一个字段要更新整条数据
方案:用 Redis Hash 单独存每个字段,支持单字段增删改查。
适用:用户资料、商品多属性、店铺信息、角色权限配置。
2、登录与会话方案
-
分布式 Session 共享方案
痛点:服务器集群部署,本机 Session 无法共享,切换节点就掉线
方案:登录 Session、JWT 令牌统一存入 Redis,所有微服务共享读取,服务做到无状态。
适用:APP / 小程序登录、后台管理系统、单点登录 SSO。
3、并发控制方案
-
Redis 分布式锁方案
痛点:多服务集群并发操作,出现超卖、重复下单、定时任务重复执行
方案:利用
SETNX互斥特性 + 自动过期,进阶用 Lua 脚本保证加锁解锁原子性。适用:秒杀减库存、订单幂等防重、定时任务集群部署、支付回调防重复处理。
4、临时凭证与频次控制
-
验证码 & 临时票据方案
痛点:短信无有效期、可无限刷验证码
方案:手机号为 Key、验证码为 Value,设置 TTL 自动过期。
适用:短信验证码、图片验证码、临时授权码、登录短链。
-
接口限流防刷方案
痛点:爬虫恶意刷接口、短信接口频繁请求、恶意攻击
方案:基于 Redis 实现:固定窗口限流、滑动窗口限流,统计 IP / 账号单位时间访问次数。
适用:短信发送限流、登录接口防刷、公共 API 接口防爬虫、网关限流。
5、统计与排行
-
原子计数器方案
痛点:点赞、阅读量频繁更新 MySQL,数据库压力大
方案:用 Redis
INCR原子自增命令,内存高速计数,定时异步落地数据库。适用:文章阅读量、点赞 / 收藏、粉丝数、商品销量统计。
-
ZSet 排行榜方案
痛点:MySQL 排序、分页性能极差,高并发下卡死
方案:利用有序集合 ZSet 的 score 分值自动排序,支持正序 / 倒序、取 TopN。
适用:热度榜单、积分排行、直播间贡献榜、商品销量榜。
6、消息与延时任务
-
List 简易消息队列方案
痛点:下单发短信、记录日志同步执行,拖慢主接口
方案:Redis List 右进左出,做生产者 - 消费者模型,异步解耦。
适用:订单通知、日志异步上报、简单异步任务;复杂可靠业务用 RabbitMQ/Kafka。
-
ZSet 延时队列方案
痛点:需要延时处理任务(订单超时关闭),无定时调度不好实现
方案:ZSet 的 score 存时间戳,定时轮询拉取已到时间的任务执行。
适用:订单 30 分钟未支付自动关闭、延时退款、会员到期提醒。
7、地理位置与防缓存问题
-
Geo 地理位置方案
痛点:MySQL 计算经纬度距离复杂、性能极低
方案:Redis Geo 存储经纬度,快速查询指定范围内附近点位。
适用:附近门店、附近的人、骑手配送范围、同城匹配。
-
布隆过滤器防缓存穿透
痛点:大量恶意请求查不存在 ID,绕过缓存直接打崩数据库
方案:Redis 布隆过滤器提前缓存所有有效 ID,无效请求直接拦截。
适用:商品 ID、订单 ID、用户 ID 存在性校验。
-
缓存三大问题统一解决方案
缓存穿透:布隆过滤器 + 空值缓存
缓存击穿:互斥分布式锁 + 热点数据永不过期
缓存雪崩:过期时间加随机值 + 服务熔断 + 集群高可用
8、缓存穿透、缓存击穿、缓存雪崩 超通俗详解:
三者本质都是:缓存没挡住请求,流量直接打到数据库,压垮 MySQL;区别只是「没挡住的原因不一样」。
1、缓存穿透
查询「数据库里根本不存在」的数据
缓存没有、数据库也没有,请求永远绕过缓存,直接查数据库。
举例:
-
故意传非法 ID:
商品id=-1、99999999 -
乱编手机号、不存在的用户 ID 每次:查 Redis → 没有 → 查 MySQL → 也没有,无限穿透。
危害
恶意爬虫 / 攻击可以轻易把数据库打崩。
解决方案
- 空值缓存 :数据库查不到,也往 Redis 存一个空值,设置短期过期(5 分钟),下次请求直接拦截。
- 布隆过滤器 :把所有合法 ID 提前放进布隆过滤器,非法 ID 直接拦截,连 Redis 都不进。
- 接口参数校验 :非法参数(负数、特殊字符、格式错误)直接在代码层拦截。
2、缓存击穿
一个「热点热门 Key」缓存刚好过期,瞬间海量并发请求同时涌入,全部打到数据库。
举例:
- 秒杀商品、首页爆款、热搜榜单,同一个超高访问量的 Key 缓存到期,一瞬间几千请求同时绕过缓存查 MySQL。
核心特点:
- 只单个热点 Key失效
- 瞬时高并发打库
解决方案:
- 互斥分布式锁(常用):缓存过期时,只放行一个请求去查数据库、回写缓存,其他请求等待或重试。
- 热点 Key 永不过期 :不设置过期时间,后台定时异步更新缓存,不走自动过期。
- 过期时间加随机偏移 :基础过期时间 + 随机 1~5 分钟,避免精准卡点过期。
3、缓存雪崩
大量缓存 Key 同时集体过期 或 Redis 整体宕机,
所有请求全部失去缓存保护,大批量直接压向数据库。
两种触发场景:
- 时间雪崩:大批量缓存设置相同过期时间,同一时刻全部失效
- 服务雪崩:Redis 断电、宕机、集群挂了,整个缓存层不可用
核心特点:
- 大批量 Key同时失效,不是单个
- 流量整体冲向 DB,极易造成数据库瘫痪、服务全线崩溃
解决方案:
- 过期时间加随机值 :所有缓存过期时间加随机偏移,错开集中过期时间,从源头避免。
- Redis 高可用 :主从复制 + 哨兵 + 集群,杜绝 Redis 单点宕机。
- 服务熔断 & 降级 :Redis 挂了之后,网关 / 服务直接降级返回默认数据,不再请求数据库。
- 缓存预热 :项目上线、凌晨低峰期,提前把热点数据主动灌入缓存。
4、三者极简对比(面试必背)
| 类型 | 核心现象 | 触发原因 | 关键区别 |
|---|---|---|---|
| 缓存穿透 | 查不存在的数据 | 非法参数、恶意请求 | 数据本身就不存在 |
| 缓存击穿 | 单个热点 Key过期 | 热门缓存同时失效 | 就一个大流量 Key 崩了 |
| 缓存雪崩 | 大批量 Key同时失效 / Redis 挂了 | 统一过期时间、Redis 宕机 | 整片缓存集体失效 |
五、一句话快速记忆
- 穿透:查没有的数据,一直绕缓存
- 击穿:一个热门缓存到期,瞬间打库
- 雪崩:一堆缓存同时过期 / Redis 挂了,全线压垮数据库
9、快速记忆总结
- 查数据 → 普通缓存、Hash 缓存
- 登录会话 → 分布式 Session
- 并发抢资源 → 分布式锁
- 验证码 / 防刷 → TTL 缓存 + 限流
- 计数 / 排行 → INCR 计数器 + ZSet
- 异步 / 延时 → List 队列 + ZSet 延时队列
- 地理位置 → Geo
- 保护数据库 → 布隆过滤器 + 解决缓存三大问题
三、Redis 高级应用
1、Lua 脚本(核心高级)
作用:把多条 Redis 命令封装成一个原子脚本执行,要么全成功、要么全失败,中间不会被其他命令插队。
解决问题:
-
多条命令网络来回耗时
-
并发下多命令无法保证原子性
-
分布式锁加锁 + 过期原子操作
-
解锁防止误删
-
批量复杂计算、库存扣减原子性
业务场景:
- 分布式锁原子加解锁
- 秒杀原子扣库存
- 批量缓存读写、条件删除
优势:减少网络往返、保证多命令原子性。
2、BitMap 位图
原理:用一个二进制位 bit 标记一个状态,极其省内存。
应用场景:
- 用户签到:1 天 1 个 bit,一年仅需 365bit
- 日活用户统计、在线状态标记
- 权限位标识、开关状态批量存储
**特点:**极度节省内存、查询快、支持位运算。
3、HyperLogLog 基数统计
原理:用极小内存做大数据量去重统计,有极低误差率。
应用场景:
- 页面 UV 访客数(独立访客)
- 直播间在线人数、活动参与人数
- 不去重看 PV、去重看 UV
特点:
- 亿级数据仅需十几 KB 内存
- 只适合统计数量,不能取出具体明细
4、Geo 地理位置
**原理:**经纬度坐标存入 Redis,内置距离计算、范围查询。
应用场景:
- 附近的门店、附近的人
- 骑手 / 网约车距离排序
- 同城匹配、商圈范围筛选
**常用命令:**添加坐标、查询直线距离、查询指定半径内点位。
5、ZSet 延时队列(高级异步)
**原理:**利用 ZSet 的 score 存时间戳,定时轮询读取到期任务。
应用场景:
- 订单30 分钟未支付自动关闭
- 延时退款、售后超时处理
- 会员到期提醒、定时消息推送
**对比:**简单延时用 Redis,高可靠延时用 RabbitMQ 延时插件。
6、布隆过滤器 BloomFilter
原理:一种概率型数据结构**,判断「一定不存在 / 可能存在」。**
作用:拦截不存在的数据请求,从源头解决缓存穿透。
应用场景:
- 商品 ID、订单 ID、用户 ID 合法性校验
- 黑名单过滤、垃圾 URL 拦截
特点:
- 能判无,不能精准判有
- 节省内存、千万级数据占用极小
7、Pipeline 管道
**原理:**一次性批量发送多条命令,不用等一条返回再发下一条,减少网络 IO。
**应用场景:**批量写入缓存、批量删除 key、大批量初始化数据
**特点:**提升批量操作性能,不保证原子性(和 Lua 区别)。
8、持久化机制 RDB + AOF
RDB 快照:
- 定时把全量数据二进制落盘
- 适合备份、恢复快
- 缺点:可能丢最后几秒数据
AOF 日志:
- 记录每一条写命令日志
- 数据几乎不丢失
- 缺点:文件大、恢复慢
**企业方案:RDB + AOF 混合开启:兼顾备份与数据安全。
9、主从复制 + 哨兵 Sentinel
主从复制:主节点写、从节点读,读写分离,分担压力。
哨兵 Sentinel:监控主从节点,主节点宕机自动选新主,实现高可用、故障自动转移。
**场景:**生产环境必备,杜绝 Redis 单点故障。
10、Redis 集群 Cluster
**原理:**分片存储,16384 个哈希槽分配到多个节点。
作用:
- 横向扩容,突破单节点内存上限
- 分片分担读写压力
- 部分节点宕机不影响整体服务
**适用:**大数据量、高并发大型项目。
11、滑动窗口限流(高级限流)
基于 Redis + ZSet 实现滑动窗口限流
解决:固定窗口限流的临界值突发流量漏洞
场景:网关接口限流、秒杀限流、API 防刷,比普通计数器更安全。
12、缓存更新高级策略
- Cache-Aside 旁路缓存(最常用)
- Read/Write Through 读写穿透
- Write Back 写回
- 适配不同业务:读多写少、写多读少、强一致性场景。