导语:数据库已经很能存了,为什么还要 Redis?一句话:数据库是"仓库",Redis 是"桌上随手拿的抽屉"——把最常用的东西放最顺手的地方。
上一篇我们讲了数据库是项目的长期记忆。但有个问题:每次读数据都去数据库翻一遍,太慢了。 数据库把数据存在硬盘上(慢),Redis 把数据存在内存里(快几十倍)。
这就是 Redis 的角色:不是数据库的替代品,是加速器——给最热的数据开一条"快车道"。
一、Redis 是干嘛的:快速记忆
- 数据库(MySQL)= 仓库:东西全,但每次取要跑一趟(硬盘,慢)。
- Redis = 桌上的抽屉:只放常用东西,伸手就拿到(内存,快)。
为什么需要它? 一个网站 90% 的请求可能都在读同一批数据(比如首页、热门文章)。如果每次都去 MySQL 查,数据库被反复折腾,慢了还会拖垮整个网站。把这份"热数据"放进 Redis,大部分请求直接从抽屉拿,快得飞起。
关键认知:Redis 存的是缓存副本——丢了可以再从数据库重建。所以它不需要像数据库那样万无一失,这也决定了它适合存什么。
二、什么数据该缓存、什么不该
| 该缓存(读多写少) | 不该缓存 |
|---|---|
| 热门文章/首页数据 | 订单、账户余额(必须绝对准确) |
| 验证码、短信验证码 | 实时价格、库存(写太频繁) |
| 登录会话(session) | 敏感数据(明文缓存风险大) |
| 计数器(点赞、访问量) | 一次性数据(用完就该删) |
判断标准一句话:"读得多、变化少、丢了能重建"——就值得缓存。 反过来,数据一变就要立刻准(钱、库存),别缓存,直接用数据库。
三、缓存和数据库怎么同步
这是新手最容易搞错的地方。数据改了,缓存里的旧数据怎么办?三种常规做法:
| 策略 | 做法 | 适合 |
|---|---|---|
| 设置过期时间(TTL) | 缓存 N 秒自动失效 | 大多数场景,最简单 |
| 先更库,再删缓存 | 更新数据库后把缓存删掉,下次读时重建 | 需要"改完马上对"的场景 |
| 先更库,再更新缓存 | 更新数据库后同步写缓存 | 读多写少、缓存命中率高的数据 |
经验:默认用"TTL + 删缓存"组合——给缓存设一个合理过期时间(比如 5 分钟),更新数据时顺手删掉对应缓存,下次读取自动重建。别用"永远不过期"的缓存,那是给自己埋定时炸弹(数据永远滞后)。
四、Redis 挂了怎么办
Redis 是加速器,不是命根子——它挂了,网站不能跟着挂。
标准做法叫缓存降级:程序先查 Redis,查不到(或 Redis 不可用)就直接查数据库,顶多慢一点,但网站还能用。
经验:
- 永远别让"Redis 不可用"导致程序崩溃:代码里查 Redis 失败要能优雅降级到数据库(让 AI 帮你写,但你要有这个意识)。
- Redis 也要设置密码(第 10 篇讲过 Redis 默认无密码最危险)——这是你线上 Redis 的必修课。
- 重要数据别只放 Redis:缓存数据丢了能重建;真正的账目数据永远在 MySQL,Redis 只是副本。
五、三大事故:雪崩、穿透、击穿(大白话版)
面试爱考、线上真要命的三兄弟,用大白话讲:
1. 缓存雪崩——大量缓存同时过期
比喻:商场所有柜台同一时间下班,所有顾客(请求)一下子全涌向仓库(数据库),仓库直接被打崩。
对策:过期时间加随机抖动(比如 5 分钟 ± 随机 30 秒),别让大量 key 同时过期。
2. 缓存穿透——查的数据根本不存在
比喻:有人专点菜单上没有的菜(查不存在的 key),每次都穿透到仓库找,白忙还累垮仓库。
对策:查不到的数据也缓存一个"空值"(短过期),或者用布隆过滤器挡在前面(知道"肯定没有"的直接拦下)。
3. 缓存击穿——单个热点 key 过期瞬间
比喻:最火的招牌菜,恰好它"下架"的那一秒钟,所有顾客同时涌向仓库——一个 key 扛下所有流量。
对策:热点数据永不过期(逻辑过期,后台更新),或加互斥锁,只让一个请求去重建缓存。
| 事故 | 一句话 | 对策 |
|---|---|---|
| 雪崩 | 大量 key 同时过期 | 过期时间加随机值 |
| 穿透 | 查不存在的数据 | 缓存空值 / 布隆过滤器 |
| 击穿 | 一个热点 key 过期瞬间 | 逻辑过期 / 互斥锁 |
六、避坑清单
- 别把 Redis 当唯一存储:它是加速器,不是保险柜。数据真丢了,你哭都来不及——主数据永远在 MySQL。
- 缓存别存敏感数据明文:用户密码、身份证这种,放缓存等于给小偷留了快车道。
- 连不上先查密码和端口:Redis 默认 6379,设了密码工具连不上是最高频问题(第 11 篇提过)。
- 别过度缓存:每个数据都塞缓存,管理成本飙升,收益却很小——先量后缓,真有性能问题再上。
总结
- Redis = 加速器:把最热的数据放"桌上抽屉"(内存),读取快几十倍;不是数据库替代品。
- 该缓存:读多写少、丢了能重建;不该缓存:钱、库存、实时价格。
- 同步三招:TTL 过期、先更库再删缓存、先更库再更新缓存——默认"TTL + 删缓存"。
- Redis 挂了:程序降级直接查数据库,网站不能跟着挂。
- 三大事故:雪崩(同时过期→加随机值)、穿透(查不存在→缓存空值/布隆过滤器)、击穿(热点 key 过期→逻辑过期/互斥锁)。
10 分钟小任务:用第 11 篇装好的 RedisInsight 连上你的 Redis,做两件事:给 Redis 设一个密码(如果还没设);把"首页数据"这类热数据想清楚——你的项目里,哪三样数据最值得进缓存?下一篇,我们认识网站的前台接待:Nginx。
下一篇:Nginx 不是服务器,是你的项目前台接待。
