缓存击穿
含义
一个存在的key,在缓存过期的那一刻,同时有大量的请求,同时读取缓存未能读到数据又同时请求DB,造成DB压力骤增
解决方案
- 设置热点数据永不过期
- 设置互斥锁,大量请求同时读取缓存未能读到数据时,只有一个请求可以拿到锁并请求DB
缓存穿透
含义
大量访问缓存和数据库中都不存在的key(即非法访问),此时缓存不起作用,请求会穿透到DB,造成DB压力骤增
这种情况往往是非法攻击
解决方案
- 接口层增加校验,比如用户鉴权;key的基础校验(key>0等)
- 采用布隆过滤器存储可能访问的key,不存在的key直接被过滤
- 访问key未在DB中查询到值,则将空值写进缓存,并设置较短过期时间(比如30秒),可防止攻击者使用同一key暴力攻击
缓存雪崩
含义
大量的key设置了相同的过期时间,导致大量key在同一时刻全部失效,大量请求直接访问DB,引起雪崩
解决方案
- 设置热点数据永不过期
- 缓存设置过期时间时加上一个随机值,防止同一时间大量key过期
- 如果缓存是分布式的,则将热点数据均匀分布在不同缓存服务器中
总结
概念 | 原因 | 解决方案 |
---|---|---|
缓存击穿 | 一个key过期的同时有大量请求 | 热点数据永不过期;互斥锁 |
缓存穿透 | key不存在,直接大量访问DB | 请求校验;布隆过滤器;缓存空值 |
缓存雪崩 | 大量key同时过期 | 热点数据永不过期;过期时间尽量随机 |