正常流程
执行流程图
缓存击穿
解决方案
1.永不过期:
可以将一些可以预料到的热门商品设置为永不过期,将一些冷门商品设置过期时间,冷门商品在一定时间内访问量激增的时候修改过期时间为永不过期
2.加锁排队:
在缓存突然失效时,只允许一个线程进入redis查询数据,redis中没有数据便从数据库中查询并设置到redis中,后面的线程再进入就会从redis中获取数据
缓存雪崩
解决方案
1.随机失效时间(针对缓存集中过期的解决方案)
2.提前给redis做好集群,做好哨兵模式(服务器宕机)
3.做好多机房(服务器突然断电 )
缓存穿透
按照正常程序的执行流程不会造成缓存穿透,只有在大量的请求访问不存在的数据,或者恶意攻击时,才会造成缓存穿透。
解决方案
1.参数校验
负数或者无效参数给过滤掉,但是不能完全的杜绝。
2.缓存空对象
在缓存击穿和缓存雪崩的基础上,不管数据库有没有这个数据,都存入到redis中,并设置随机过期时间(既能防雪崩,又能防穿透)
3.布隆过滤器
说白了就是一种数据结构,比list、set、map更加的高效,并且占用的空间更少