redis的雪崩、穿透和击穿

redis雪崩

对于系统 A,假设高峰期 每秒 5000 个请求,redis可以扛住每秒 4000 个请求,系统能够正常运行

但是redis意外全部 down机,此时 每秒 5000 个请求全部访问 数据库,数据库也会down机。即使再次启动 数据库,又会被高并发量导致down机

解决方案:

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

穿透

根据id进行查询,如果在redis中查不到,就会查询 数据库

黑客利用这点,发送大量请求,查询不存在的id,导致这些请求全部落在 数据库,导致数据库down机

解决方案:

  • 如果从数据库中只要没查到,就写一个值到redis里,比如 set 5891 none (5891是id),然后设置一个过期时间
    下次查询该 key ,在缓存失效之前,都可以直接从缓存中取数据。

击穿

某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了redis,直接请求 数据库

解决方案:

  • 可以将热点数据设置为永远不过期
  • 基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。

感谢:
https://zhuanlan.zhihu.com/p/82980434


原文出处:/show_1IXQOBdO37I.html