什么是缓存击穿、缓存穿透、缓存雪崩?
1)缓存穿透:
缓存穿透是指查询内存和数据库都不存在的数据,每次请求都会打到数据库上,从而压垮数据库。
解决方案:
- 缓存null:根据id=30000去数据可查找user,user=null,也将user=null放到redis中
- 使用布隆过滤器:是一种数据结构,判断值肯定不存在或者可能存在
准备一个足够长的数组,将值存入数据库的时候,同时将key存入布隆过滤器 - 查找key的时候,先去布隆过滤器中获取这个key的三个hash值,在根据hash值去布隆过滤器中获取值,三个值中有一个0,代表数据肯定不存在,如果三个值都是1,代表可能存在,再去数据库查找数据,
针对这个问题,加一层布隆过滤器。布隆过滤器的原理是在你存入数据的时候,会通过散列函数将它映射为一个位数组中的K个点,同时把他们置为1。
这样当用户再次来查询A,而A在布隆过滤器值为0,直接返回,就不会产生击穿请求打到DB了。显然,使用布隆过滤器之后会有一个问题就是误判,因为它本身是一个数组,可能会有多个值落到同一个位置,那么理论上来说只要我们的数组长度够长,误判的概率就会越低,这种问题就可以在一定程度上得到解决。
缓存击穿:
redis中不存在这个key,数据库中存在,key在redis中过期了,当大量请 求过来的时候,请求会直接打到数据库上,引起数据库崩溃
解决方案:
- 加锁:操作数据库的时候加锁
- 当某一个请求去数据库查询的时候,同时在redis中将值设为null,待他 从数据库查到数据返回后,设置具体的值
缓存雪崩:
redis中不存在这些key,数据库中存在,这些key在某一时间集中过期了, 当大量请求过来的时候,请求会直接打到数据库上,引起数据库崩溃
解决方案:
- 加锁
- 多级缓存 设置key 的不同的过期时间,比如固定的过期时间上在随机1-10分钟