Redis 缓存雪崩、缓存穿透、缓存击穿
缓存雪崩
Redis 缓存 key 同一时间大量失效,导致大量请求全部打到数据库,造成数据库挂掉。
应对方案:
- 随机初始化缓存失效时间
- 把热点 key 分散到不同的集群
- 不设置缓存失效时间
- 通过定时任务刷新缓存使缓存永不失效
缓存穿透
是指缓存和数据库中都没有的数据,一般常见于黑客攻击。
比如用请求 id=-1
的数据,这种数据直接穿透缓存,打在数据库上,导致数据库挂掉。
应对方案:
- 接口层增加校验,如用户鉴权校验,id 做基础校验,
id <= 0
的直接拦截。 - 从缓存取不到的数据,在数据库中也没有取到,这时也可以将
key-value
对写为key-null
,缓存有效时间可以设置短点,如 30 秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个 id 暴力攻击。 - 布隆过滤器(Bloom Filter)。
缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
应对方案:
- 设置热点数据缓存永远不过期。
- 加锁(互斥锁/分布式锁)。