一、缓存穿透
概念:
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
1.接口校验请求参数的有效性,如校验id是否合法
2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒。
二、缓存雪崩
概念:
指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。侧重很多的缓存数据都失效了。
解决方案:
1.设置不同的缓存到期时间,如热门数据有效期长一点,冷门数据有效期短一点。
2.针对长期有效,数据变化基本不变的数据进行永久性缓存。
3.缓存服务集群部署
三、缓存击穿
概念:
指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决方案:
1.热点数据实现缓存永久有效
2.采用互斥锁来缓存数据
缓存击穿的重点就是,同一时间点上,大量请求没有在缓存中命中数据,而对数据库服务产生巨大的压力,所以我们可以在请求数据库之前加上一个锁,持有锁的线程才能去请求数据库,并缓存到缓存数据库,其他的线程等待,最后从缓存获 获取数据。
代码展示: