Redis 学习资料

13 阅读13分钟

一、Redis简介

Redis 是开源、高性能的内存型 Key-Value NoSQL 数据库,主打基于内存读写,速度极快;

不只是简单缓存,还支持字符串、Hash、List、Set、有序 ZSet、Geo、位图等多种复杂数据结构,同时支持数据持久化、主从复制、哨兵、集群,可做高可用、分布式部署。

一句话总结:跑得飞快、数据结构丰富、能存内存也能落硬盘、适合高并发场景的中间件数据库

1、Redis 核心优势

  1. 全内存操作,毫秒级读写,远超 MySQL 磁盘库;
  2. 单线程模型,无锁竞争,并发性能强;
  3. 数据结构多,能搞定复杂业务;
  4. 可持久化,断电 / 重启数据不丢失;
  5. 天然支持分布式、高可用、扩容。

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、快速记忆总结

  1. 查数据 → 普通缓存、Hash 缓存
  2. 登录会话 → 分布式 Session
  3. 并发抢资源 → 分布式锁
  4. 验证码 / 防刷 → TTL 缓存 + 限流
  5. 计数 / 排行 → INCR 计数器 + ZSet
  6. 异步 / 延时 → List 队列 + ZSet 延时队列
  7. 地理位置 → Geo
  8. 保护数据库 → 布隆过滤器 + 解决缓存三大问题

三、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 写回
  • 适配不同业务:读多写少、写多读少、强一致性场景。