缓存雪崩
缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库 CPU 和内存造成巨大压力,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃。(所以,缓存雪崩的场景通常有两个:大量热点key同时过期;缓存服务故障;)解决方法:
- 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队,保证缓存单线程写。
- 热点数据可以考虑不失效,后台异步更新缓存,适用于不严格要求缓存一致性的场景。
- 双key策略,主key设置过期时间,备key不设置过期时间,当主key失效时,直接返回备key值。
- 为 key 设置不同的缓存失效时间,让key均匀的失效。
- 构建缓存高可用集群(针对缓存服务故障情况)。
- 当缓存雪崩发生时,服务熔断、限流、降级等措施保障。
缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。解决方法:
- 缓存空值(null)或默认值。在数据库查询不存在时,将其缓存为空值(null)或默认值。需要注意的是,针对空值的缓存失效时间不宜过长,一般设置为5分钟之内。当数据库被写入或更新该key的新数据时,缓存必须同时被刷新,避免数据不一致。
- 使用布隆过滤器请求白名单。在写入数据时,使用布隆过滤器进行标记(相当于设置白名单),业务请求发现缓存中无对应数据时,可先通过查询布隆过滤器判断数据是否在白名单内,如果不在白名单内,则直接返回空或失败。