Redis - 缓存穿透、缓存击穿、缓存雪崩
缓存穿透、缓存击穿、缓存雪崩是使用 Redis 时最常遇到的三种异常情况,然而经常有人弄混这三种情况,下面就详细介绍这三种异常的区别,以及产生原因和应对手段。
缓存雪崩
现象
缓存中大量的数据失效,导致大量的请求无法获取数据,从而将流量压力传导到数据库上。
原因
一般而言,缓存雪崩有两种可能性:
大量的数据同一个时间失效,比如业务关系强相关的数据要求同时失效
Redis 宕机
解决方案
如果数据需要同一时间失效,可以给这批数据加上一些随机值,使得这批数据不要在同一个时间过期,降低数据库的压力。
服务降级:如果发现产生缓存雪崩,可以对服务进行降级,提供默认返回值,或简单的提示信息。
服务熔断:对于非核心功能的业务,拒绝其请求;只允许核心功能的业务访问数据库获取数据。
做好主从的部署:当主节点挂掉后,能快速地使用从结点顶上。
缓存击穿
现象
多个请求访问某一个热点数据,该数据突然失效,导致大量数据访问数据库获取相同的数据。
原因
一般而言都是因为热点数据过期。
解决方案
不给热点数据设置过期时间。需要更新数据时,使用同步直写或者异步写的方式更新缓存。
缓存穿透
现象
如果要访问的数据,在缓存和数据库中都不存在,就会同时给缓存和数据库带来压力。
原因
一般而言,只有两种情况会出现缓存穿透:
业务数据被误删,导致缓存和数据库中都没有数据。
恶意进行 DDos 攻击。
解决方案
给缓存设置默认值,如果找不到,就设置默认值或者空值,避免重复穿透。
使用布隆过滤器,如果布隆过滤器中没有查到数据,就不去数据库中查。
在处理请求前增加恶意请求检测,如果检测到是恶意攻击请求,则拒绝进行服务。
评论