本节讲解一下你即使项目中使用了缓存,在高并发的情况下可能遇到的问题
1、缓存穿透
如果有人恶意攻击你的服务器,比如查询编号为1000000万的商品,那你数据库没有这样一个商品,就需要查询数据库,即使数据库中没有,还是会给数据库造成压力,如果这个攻击者使用压力测试工具,对你造成瞬间的100W次访问,这100W次的访问都会查询数据库,造成数据库压力太大而崩溃。这就叫做缓存穿透。
解决方案就是:查询一个商品,不管有没有这个数据,都需要在缓存中放个数据,为了怕将来有个数据,可以给这个缓存数据加上一个时间戳。
2、缓存雪崩
缓存雪崩就是热点数据在同一时间集体失效,为啥会出现这个情况呢?因为我们给这些数据设置了同样的过期时间。
解决方案:设置随机的过期时间。
3、缓存击穿
缓存击穿是某一个热点数据,在访问最频发的时候失效,导致大量请求访问数据库。
所以需要保障同一个时间只有一个请求可访问。其他请求需要等待。
综上所述:我们在使用redis进行缓存数据时还是要考虑穿透、雪崩、击穿这三个问题,具体就是在代码中考虑三点即可:
1、查询出来的空结果要缓存,解决缓存穿透的问题
2、设置过期时间【加上随机值】,解决雪崩问题
3、加上锁,解决缓存击穿的问题。