当我们用户查询数据去redis查询没有时,就会去数据库中查找,但是数据库中也没有,缓存就没有命中。这时候当用户很多的时候,都发生了这种情况,就会导致数据库压力很大,就导致了缓存穿透。
解决办法:1.布隆过滤器,对用户所传过来的参数在控制层先进行校验,不符合则丢弃。
2.缓存空对象,对于空的对象会给它在redis也建立个空值的缓存(不推荐)。
就好比微博热搜,大规模大并发的集中对一个点进行查询,就有可能导致缓存击穿,直接访问数据库。
解决办法:1.设置热点数据永不过期。
2.加互斥锁,也叫分布式锁。
其实就是好比双十二节日,某波商品被集中放入了缓存,假设这批缓存过期时间为一小时,当一小时过后,这批缓存就会集体失效,而当缓存失效后,就会有大批查询数据直击数据库,就可能会导致缓存雪崩,数据库直接崩溃。
解决办法:1.redis挂掉不可怕,可怕的是数据库,所以多建立几个redis节点。
2.限流降级。
3.数据预热。