面试题答案
一键面试缓存穿透
- 问题阐述:
- 指查询一个一定不存在的数据,由于缓存不命中,每次都会去数据库查询,若有大量这种请求,就会给数据库造成巨大压力,甚至压垮数据库。
- 解决办法:
- 布隆过滤器:在查询之前,使用布隆过滤器先进行判断数据是否存在。布隆过滤器通过一个位数组和多个哈希函数来判断元素是否在集合中。如果布隆过滤器判断数据不存在,那么数据一定不存在,就不会去查询数据库,从而避免缓存穿透。
- 缓存空值:当查询数据库发现数据不存在时,将空值也缓存起来,并设置一个较短的过期时间,这样下次相同查询就可以直接从缓存获取空值,而不会穿透到数据库。
缓存雪崩
- 问题阐述:
- 指在某一时刻,大量的缓存数据同时过期,导致大量请求直接落到数据库上,造成数据库压力瞬间增大,甚至可能导致数据库崩溃。
- 解决办法:
- 设置不同过期时间:避免大量缓存数据设置相同的过期时间。在给缓存设置过期时间时,加入一个随机值,让缓存的过期时间在一个合理的区间内离散分布,降低同时过期的可能性。
- 使用二级缓存:可以设置主缓存和二级缓存,主缓存过期后,先从二级缓存获取数据,同时异步更新主缓存,这样可以减少直接查询数据库的压力。
- 搭建集群缓存:将缓存数据分散到不同的缓存服务器节点上,即使部分节点出现问题,其他节点仍能正常提供缓存服务,增强系统的容错性。同时,结合过期时间打散策略,降低集群整体缓存雪崩的风险。