雪崩
定义:大量请求无法在Redis缓存中进行处理,比如Redis挂了,请求发送到数据库层,导致数据库压力过大
原因分析:
- 大量数据同时过期导致的请求无法处理转而请求数据库
- Redis宕机
解决方案:
针对原因一
- 过期时间加随机值,即加随机1-5分钟内过期
- 服务降级,非核心业务不访问缓存直接返回空,繁忙或预定义信息,核心业务允许查询缓存,缓存缺失可以继续查询数据库
针对原因二
- 熔断,暂时停止访问缓存避免缓存雪崩导致的数据库雪崩,限流,控制请求量,避免过多请求发送到数据库
- 提前构建高可用的Redis集群,实现主从及哨兵(防止主从架构宕机的情况)
击穿
定义:热点key过期导致的失效瞬间直接请求发送到了数据库从而导致的数据库压力激增,从而影响其他的请求
原因分析:热点数据过期,通常发生在大量数据缓存过期的时候,同步发送到了数据库
解决方案:热点数据不设置过期时间
穿透
定义:访问的数据既不在数据库也不在缓存内,导致在访问缓存时发生缓存缺失,在访问数据库也没有对应的数据,结果也就不会写入缓存,大量的请求时会同步请求数据库导致数据库产生巨大压力
原因分析:
- 数据误删,业务层异常,导致的缓存和数据库内都没有数据
- 恶意攻击,访问数据库内没有的数据,增加数据库压力
解决方案:
- 没查到就设置一个空值到缓存内并设定对应的过期时间,下次同样的key访问可直接从缓存内取数据
- 入口前端进行请求检测,比如参数合法性
- 布隆过滤器提前判断数据是否存在,减轻数据库压力 (布隆过滤器:判断一个元素是否存在于一个集合中,存在误判)