# 缓存雪崩

缓存在同一时刻一起失效, 大量的请求直接打到了 DB 上。

解决方案:

  • 缓存失效时间设置一个随机值,避免大量缓存同时失效。
  • 设置热点数据永远不过期,有更新操作就更新缓存。

举个例子:

假设有个定时任务在每天凌晨 3 点的时候会更新缓存,好巧不巧。凌晨 3 点,有一个秒杀活动。得!清除缓存的一刹那,大量请求涌入,直接打到了 DB 上。这不就刺激了么, DBA 有了一个不眠夜。

重启 DBA ,还是会被瞬间打挂。

# 缓存击穿

一个 Key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。

理解就是通过一个点,击穿了缓存这个屏障。

解决方案:

  • 设置热点数据不过期
  • 同一个数据,查 DB 互斥。

例子同上,区别在于 缓存击穿是一个热点 key , 而缓存雪崩时大面积的 key .

# 缓存穿透

缓存穿透是指缓存和数据库中都没有的数据。请求频繁查询数据库。

解决办法:

  • 特定接口可以通过参数校验来解决
  • 布隆过滤器。
  • 不存在的值也缓存。

这个更简单了。比如 根据 id 去请求商品,商品 id 都是大于 0 的, 请求偏偏用了 id=-1 . 这不又刺激了么又.

# 最后

希望和你一起遇见更好的自己