2

缓存雪崩+击穿+穿透

缓存雪崩

目前电商首页以及热点数据都会去做缓存 ,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题:缓存雪崩。

缓存雪崩是指在大QPS时,缓存刚好失效或更新,大量请求打到DB上,导致DB扛不住挂掉。

image.png

解决方案

  1. 错开KEY的失效时间

setRedis(Key,value,time + Math.random() * 10000);

  1. 热点数据永不过期,保持和数据库一致性更新

缓存穿透

指缓存和数据库中都没有的数据,但却产生了数据库的查询。比如数据库的 id 都是1开始自增上去的,如果发起为id值为 -1 的数据或 id 为特别大不存在的数据。

image.png

解决方案

  1. 接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。
  2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值具体取啥问产品,或者看具体的场景,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。
  3. 可以根据场景结合uri和请求参数做缓存。
  4. nginx代理层限制同IP高频率访问

缓存击穿

缓存击穿和缓存雪崩一样,不过前者是点,后者是面。缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。

解决方案

  1. 热点数据永不过期,保持和数据库一致性更新。
  2. 加上互斥锁。缓存更新时上锁,此时进来的请求可以先sleep堵塞起。

image.png


菜问
625 声望132 粉丝

10年后端开发,常用编程语言PHP,java,golang,python。