Redis击穿 穿透 雪崩,看这一张表格就清晰了:
原因 | 场景 | 解决 | |
击穿 | 某个热点数据 -不在缓存中 -在数据库中 (通常是因为该数据缓存已过期) | 热搜词条、 秒杀商品 | 1、设置热点数据永不过期或者过期时间较长; 2、热点数据提前预热,存入缓存并设置合理过期时间; 3、请求数据库写数据到缓存之前先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库压力。 |
穿透 | 大量请求的key -不在缓存中 -不在数据库中 (key不合理) | 黑客攻击 | 1、首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端; 2、缓存无效 key:如果缓存和数据库都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间; 3、使用布隆过滤器:通过布隆过滤器可以非常方便地判断一个给定数据是否存在于海量数据中。当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在则直接返回请求参数错误信息给客户端。 |
雪崩 | 大量请求访问数据 -在缓存中失效/过期 -在数据库中 (导致大量请求直接落在数据库上) | 缓存宕机、 热点缓存失效 | 针对缓存宕机: 1、采用 Redis 集群,避免单机出现问题(宕机)整个缓存服务都没办法使用; 2、限流,避免同时处理大量的请求。 |
针对热点缓存失效: 1. 设置不同的缓存失效时间比如随机设置缓存的失效时间; 2. 缓存永不失效,不太推荐,实用性太差; 3. 采用多级缓存,比如本地进程作为一级缓存,redis作为二级缓存,不同级别的缓存设置的过期时间不同,即使某级缓存过期了,也有其它级别缓存兜底。 |
半文言文速记版:
原因 | 场景 | 解决 | |
击穿 | 某热数 缓失效(/过) 访库 | 热搜词条 | 热永不过/长 预热 加缓 设合理过时 库写缓前 先获互斥锁 保只一请落库 减库压 |
穿透 | 多数 缓无库也无 | 黑客攻击 | 参验 异参抛异 缓无效key 布滤器判数存海数中否 无则返参错 存继后 |
雪崩 | 多缓-过 多请访库 | 某缓宕机/热缓失效 | 宕机-集群 避单宕整缓无法用 限流 避同处大量请; |
失效-设异缓失效t如随机设 设缓永不失(实用性差 不荐) 多级缓存(本进一rd二)异级异过时 |
参考:Redis常见面试题总结(下) | JavaGuide(Java面试+学习指南)
欢迎大家指正补充,谢谢!