一、穿透
数据库不存在,redis不存在
二、击穿
某个key,数据库存在,redis不存在(首次请求、key过期),大量(相同key)的请求一次性进来
- 过期时间随机
- 锁方案(见下文)
三、雪崩
缓存击穿的情况*N,一批key,数据库存在,redis不存在(首次请求、key过期),大量(不同key)的请求一次性进来
- 过期时间随机
- 锁方案(见下文)
四、解决方案
布隆过滤器方案
1 | 1、客户端实现过滤拦截 |
锁方案
1 | 1、请求redis,没有值 |
分布式锁
1 | 使用SET key value [EX seconds] [PX milliseconds] [NX] 或 setnx + EXPIRE |
五、缓存双写一致
先更新数据库,后更新缓存
由图可知:
- 请求A先更新DB
- 请求B也更新DB
- 但是因为网络等原因,B却比A更早更新了缓存。
- 导致数据的不一致,出现脏数据
先更新数据库,后删除缓存
- 更新DB成功
- 删除缓存失败
- 导致缓存数据为旧数据,出现脏数据
先更新缓存,后更新数据库
- 更新缓存成功
- 更新DB失败
- 导致数据不一致,出现脏数据
先删除缓存,后更新数据库
由图可知:
- 如果同时有一个请求A先删除,再进行更新操作
- 中间另一个请求B进行查询发现没有缓存,查询了DB更新了缓存
- 之后A再更新DB
- 导致数据的不一致,出现脏数据
解决方案
1 | 1、消息队列 |