缓存击穿(面试常问)
某个热点key在缓存和数据库都存在,过期时,大量用户访问这个key,读缓存读取不到就会同时去数据库读,压垮数据库.
怎么解决:
-
将热点数据设置不过期,但是需要自己判断哪些数据是热点数据
-
加锁,多个访问时,只有一个客户端能获得锁,其他会被阻塞,等锁释放了,缓存中已有数据,其他客户端就不用访问数据库,但是这个方法会影响吞吐量(有损方案)
缓存雪崩(面试常问)
情况一.给大量的key设置了相同的过期时间(数据在缓存和数据库都存在),到了过期时间
,key集体失效,访问就会全部进入数据库(不能使用缓存击穿的加锁来解决)
解决方法:
-
错开过期时间,在过期时间加随机值
-
服务降级,暂停非核心数据数据查询缓存,返回一个错误页面或者空值(有损方案)
情况二.redis宕机,大量请求进入数据库
解决方法:
-
事前预防:搭建高可用集群.(提倡使用 )
-
多级缓存.缺点是实现复杂度高
-
熔断,通过监控一旦雪崩出现,暂停缓存访问,待实例恢复,返回预定义信息(有损方案)
-
限流,通过监控一旦发现数据库访问量超过阈值,限制访问数据库的请求数(有损方案)
缓存穿透(面试常问)
key在数据库和缓存都不存在,访问这个key每次都会进入数据库
-
会被恶意请求利用进行攻击数据库
-
缓存雪崩和缓存击穿可以自然恢复,缓存穿透不能.
解决方法:
1.数据库没有这个key就把他关联一个null值放入缓存,缺点是这样的key没任何意义,浪费空间.
2.布隆过滤器
-
过滤器判定key是否存在不存在过滤掉
-
需要提前将所有key预加载进过滤器
-
布隆过滤器不能删除,所有查询已经删除的数据会发生穿透(布谷鸟过滤器可以解决这个问题)