在这里我们先讲一下正常的访问流程:
首先:用户去访问淘宝的一个品牌数据,淘宝会先将请求发送到redis中,如果redis中有,那么就返回数据,如果redis中没有,那么回去数据库中查询,返回数据的同时,也会将数据同步到redis中,下次请求,就会从redis中返回数据,而不会去访问数据库。
1.缓存的雪崩
如上图:
比如在双十一时,某宝的首页有许多的数据资源,我们都将这些数据缓存在redis中,并且设置缓存失效的时间为四个小时,当四个小时过去后,所有的请求访问都聚集在数据库中。像这样的情况就是缓存雪崩。
解决方案:
设置缓存失效时间不同,让他们失效时间不同。
不设置缓存时效的时间。
2.缓存的穿透
如上图所示:
示例,在数据库中id都是从0开始的,有些用户就请求id小于0的数据,这种数据在redis中不存在,所以数据请求传到数据库中,数据库中也没有这样的数据,所以数据库返回空。
解决方案:
对参数的合法性进行校验
布隆过滤器
3.缓存的击穿
示例:
比如在某宝上,大家在拍卖一件东西,大家都在对这件东西进行加价,某宝设置这件东西的数据的缓存时效时间为三个小时,所以当三个小时过去后,大量的请求就会直接访问在数据库中。
在这里是某一个数据的请求。
解决方案:
缓存永远不时效
使用分布式锁