缓存穿透
缓存和数据库中都没有的数据,而用户却不断发起请求
如缓存中,没有id=-1
的数据或者特别大的不存在的数据,导致一直无法命中缓存,请求落到数据库
黑客可能利用漏洞攻击,从而去压垮数据库
解决方案
- 程序中,添加验证拦截逻辑
- 缓存空数据、非正常数据,当请求的key=null时,也可命中
- 布隆过滤器
缓存击穿
当前热点数据在缓存中存储到期或者意外失效时,多个线程同时
并发
访问热点数据
因为缓存刚过期,同时是并发请求,导致过期的数据还未来得及写到缓存中,并发请求都会到数据库中查询数据
解决方案
- 将热点数据设置为永不过期
- 做缓存预热
当活动开始、并发请求之前,将热点数据提前加载到缓存中 - 添加互斥锁(会降低吞吐量)
3.1 请求数据库前,先拿到锁
3.2 请求数据库结束后,存入缓存中,释放锁
3.3 其它请求拿不到锁的时候,等待锁释放 - 添加备用缓存
4.1 部署两台缓存服务器,当1台缓存服务器数据异常时调用
4.2 逻辑上可将2台缓存服务器的key过期时间设置不等,增强命中概率
缓存雪崩
大量缓存集中或者缓存同时在大范围中失效,出现了大量请求去访问数据库,从而导致CPU和内存过载,甚至宕机
和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库
解决方案
- 给缓存设置不同的失效时间,避免同一时间失效
- 缓存降级,对请求进行限流,在数据库前做一个限流层,保证服务不会完全宕机