Redis 的雪崩、穿透和击穿
缓存雪崩 假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。 通常我们在使用 Redis 的时候,都会为缓存设置过期时间,但是如果在某个时间点,有大量缓存失效,那么下一个时间点就会有大量请求访问到数据库,这种情况下,数据库可能因为访问量多大导致“崩溃”,这就是缓存雪崩。 第一种情况:缓存雪崩的事前事中事后的解决方案如下: 事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。对于缓存大面积失效的情况可以设置缓存的失效时间使用随机数,避免此问题。 事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。 第二种情况: 不设置缓存过期时间 最暴力的解决办法,缓存不设置自动过期时间,只要缓存不崩,数据库就不会崩。 设置随机过期时间 另外一个办法,就是让缓存过期时间不那么一致,比如一批缓存数据24小时后过期,那么就在这个基础上,让每条缓存的过期时间前后随机 1-6000 秒(1