缓存雪崩

缓存雪崩是指在某一个时刻出现大规模的缓存失效的情况,大量的请求直接打在数据库上面,可能会导致数据库宕机,如果这时候重启数据库并不能解决根本问题,会再次造成缓存雪崩。

为什么会造成缓存雪崩?

一般来说,造成缓存雪崩主要有两种可能

  • Redis 宕机了
  • 很多 key 采取了相同的过期时间

如何解决缓存雪崩?

  • 为避免 Redis 宕机造成缓存雪崩,可以搭建 Redis 集群。
  • 尽量不要设置相同的过期时间,可以在原有的过期时间加上随机数。
  • 服务降级,当流量达到一定的阈值时,就直接返回“系统繁忙”之类的提示,防止过多的请求直接打在数据库上,这样虽然难用,但是至少可以避免服务器宕机。

缓存击穿

缓存雪崩是大规模的 key 失效,而缓存击穿是一个热点的 key,有大量并发集中对其访问,突然间这个 key 失效了,导致大量并发请求全部打在数据库上, 导致数据库压力剧增,这种现象就叫做缓存击穿。

比较经典的例子就是商品秒杀时,大量的用户在抢某个商品时,商品的 key 突然过期失效了,所有请求都到数据库上了。

如何解决缓存击穿?

  • 热点 key 不设置过期时间,避免 key 过期失效。
  • 加锁,如果缓存失效的情况,只有拿到锁才能查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库宕机,不过这样会导致系统的性能变差。

缓存穿透

缓存穿透是指用户的请求没有经过缓存而直接请求到数据库上了,比如用户请求的 key 在 Redis 中不存在,或者用户恶意伪造大量不存在的 key 进行请求,都可以绕过缓存,导致数据库压力太大宕机。

如何解决缓存穿透?

  • 参数校验,例如可以对用户 id 进行校验,直接拦截不合法的请求。
  • 缓存空值,如果某个 key 在 Redis 中不存在,在数据库中也不存在,则把这个 key 值保存到 Redis,设置 value = “null”。
  • 布隆过滤器,布隆过滤器可以判断这个 key 在不在数据库中,特点是:如果判断这个 key 不在数据库,那么这个 key 一定不在数据库中,如果判断这个 key 在数据库中,也不能保证这个 key 一定在数据库中。就是会有少数漏网之鱼,造成这种现象的原因是因为布隆过滤器使用了 hash 算法,对 key 进行 hash 时,不同的 key 的 hash 值一定不同,但是相同的 hash 值不能说明这两个 key 相同。

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

载入天数...载入时分秒... 本站使用 Volantis 作为主题 鲁ICP备-20012065号