前言
- 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据
流程图

为什么使用 redis 作为缓存: 减少 DB 层 重复数据查询 的压力
- redis 有 10 万QPS
- DB 只有几万(MySQL 1 万 QPS)
1. 什么是缓存击穿?
热 key 失效,当一个访问量特别高的一行数据在 redis 中失效,所有的请求全部打到 DB 层,可能直接将 DB 打爆
2. 如何解决缓存击穿?
两个方向:
- 热 key 不失效
- 当热 key 失效(状态),同时只放一个请求去回源更新redis,其他请求(等待回源完成再取 redis 的数据或者返回空)
怎么做?
方案1: 定时刷新
- 每行数据除了数据本身以外储存一个更新标记,并且更新标记的过期时间小于数据的过期时间
case: 数据过期时间 10 分钟,数据的更新标记的过期时间 10 秒 - 每次查询数据先检查更新标记是否存在(使用 redis 的 SET NX PX 命令),写失败意味着不需要更新,写成功意味着需要更新.
- 判断第二步的执行结果:
- 成功(回源查询 DB 数据并更新到 redis,同时重置过期时间);
- 失败(直接取 redis 的数据,如果

3747

被折叠的 条评论
为什么被折叠?



