相关概念

  • 缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,大量的请求直接落在了数据库上,造成数据库短时间内承受⼤量请求⽽崩掉。

  • 缓存穿透key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

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

解决方案

缓存雪崩

处理缓存雪崩的一种方式是在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值就好了,这样可以保证数据不会在同一时间大面积失效。

缓存穿透

  • 接口参数校验:一般处理方式是在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接返回校验失败信息。

  • 设置默认值:从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试等,同时设置短点的超时时间

  • 布隆过滤器(Bloom Filter)也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。布隆过滤器

缓存击穿

设置热点数据永远不过期,或者加上互斥锁就行了。

Redis 挂掉了,请求全部走数据库解决

从三个时间段去分析下:

  • 事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
  • 事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL被打死。
  • 事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。