# 缓存雪崩
缓存在同一时刻一起失效, 大量的请求直接打到了 DB
上。
解决方案:
- 缓存失效时间设置一个随机值,避免大量缓存同时失效。
- 设置热点数据永远不过期,有更新操作就更新缓存。
举个例子:
假设有个定时任务在每天凌晨 3 点的时候会更新缓存,好巧不巧。凌晨 3
点,有一个秒杀活动。得!清除缓存的一刹那,大量请求涌入,直接打到了 DB 上。这不就刺激了么, DBA
有了一个不眠夜。
重启 DBA
,还是会被瞬间打挂。
# 缓存击穿
一个 Key
非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 Key
在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。
理解就是通过一个点,击穿了缓存这个屏障。
解决方案:
- 设置热点数据不过期
- 同一个数据,查
DB
互斥。
例子同上,区别在于 缓存击穿是一个热点 key
, 而缓存雪崩时大面积的 key
.
# 缓存穿透
缓存穿透是指缓存和数据库中都没有的数据。请求频繁查询数据库。
解决办法:
- 特定接口可以通过参数校验来解决
- 布隆过滤器。
- 不存在的值也缓存。
这个更简单了。比如 根据 id
去请求商品,商品 id
都是大于 0
的, 请求偏偏用了 id=-1
. 这不又刺激了么又.
# 最后
希望和你一起遇见更好的自己