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