快速导航
Redis不可不知的故障现象
一、缓存雪崩
定义:
由缓存机器故障宕机,导致大量请求全部落到数据库,超出了数据库的处理能力极限,进而导致数据库压力增大、宕机的情况。
解决方案:
- 事前:Redis集群部署,主从+哨兵,避免全盘奔溃
- 事中:本地缓存 + 限流&降级,避免数据库压力过大宕机
- 事后:Redis持久化,机器重启后可以自动从磁盘加载数据,恢复缓存数据
二、缓存穿透
定义:
大批量请求缓存和数据库中都不存在的数据,导致数据库压力变大,甚至宕机。
解决方案一:
查询的key比较集中的时候,可以在查询数据库结束后给缓存中写一个空值或者默认值进去。设置一个过期时间,避免后续的大量请求落到数据库。
解决方案二(更普遍的做法):
在系统和缓存之间使用布隆过滤器,将数据库中所有可能的数据哈希映射到布隆过滤器中。
在请求到布隆过滤器时判断:
- 若请求数据的key不存在布隆过滤器中,直接返回不存在(可以确定该数据也一定不存在于数据库)
- 若请求数据的key在布隆过滤器中存在,则继续查询缓存
三、缓存击穿
定义:
某个热点key访问非常频繁,且请求时间比较集中,是高并发场景。当这个key失效的瞬间,大量的请求直接落到数据库,导致数据库压力骤增,甚至宕机。
解决方案:
- 基本不更新的热点数据,设置为永不过期
- 更新不频繁且缓存刷新流程耗时较少的情况下,可以基于互斥锁保证较少量的请求落到数据库,并重新构建缓存