面试题答案
一键面试缓存雪崩
- 问题理解:在高并发场景下,大量缓存数据在同一时间过期失效,导致这些请求直接访问数据库,使数据库瞬间承受巨大压力,可能引发数据库崩溃。
- 解决方案:
- 随机过期时间:给缓存设置一个随机的过期时间,避免大量缓存同时过期。例如原本缓存过期时间为60分钟,现在设置为55 - 65分钟之间的随机值。
- 互斥锁:当缓存失效时,先获取锁,只有拿到锁的请求才能去查询数据库并更新缓存,其他请求等待。锁释放后,其他请求从缓存获取数据。
- 优缺点及适用场景:
- 随机过期时间:
- 优点:实现简单,能有效打散缓存过期时间,降低数据库压力。
- 缺点:难以精确控制缓存过期时间,可能存在部分数据提前过期或过期时间过长导致数据不实时的情况。
- 适用场景:对数据实时性要求不是特别高,缓存数据相对稳定的场景,如商品介绍页面缓存。
- 互斥锁:
- 优点:能保证同一时间只有一个请求访问数据库,有效保护数据库。
- 缺点:引入锁机制可能导致性能下降,特别是高并发场景下锁竞争激烈,还可能出现死锁问题。
- 适用场景:适用于对数据一致性要求较高,数据库处理能力相对有限的场景,如库存数据缓存。
- 随机过期时间:
缓存穿透
- 问题理解:指查询一个一定不存在的数据,由于缓存和数据库都没有,导致请求每次都穿透到数据库,若恶意攻击者利用此漏洞发起大量请求,会使数据库压力过大甚至崩溃。
- 解决方案:
- 布隆过滤器:在缓存之前增加布隆过滤器,将所有可能存在的数据哈希到一个足够大的位数组中,查询时先通过布隆过滤器判断数据是否存在,若不存在则直接返回,不会访问数据库。
- 空值缓存:当查询数据库发现数据不存在时,也将空值缓存起来,并设置较短的过期时间,后续相同请求直接从缓存获取空值,不再访问数据库。
- 优缺点及适用场景:
- 布隆过滤器:
- 优点:能高效过滤掉不存在的数据,避免大量无效请求穿透到数据库,性能高且空间效率高。
- 缺点:存在误判率,即可能将不存在的数据误判为存在,但可以通过调整位数组大小和哈希函数来降低误判率;新增数据时需要更新布隆过滤器。
- 适用场景:适用于数据量较大且相对固定,对误判率有一定容忍度的场景,如电商商品ID查询。
- 空值缓存:
- 优点:实现简单,能快速拦截不存在数据的请求。
- 缺点:会占用额外的缓存空间,且缓存空值的过期时间不好把控,若设置过长可能影响业务逻辑,过短则无法有效避免缓存穿透。
- 适用场景:适用于数据更新频繁,且对缓存空间占用不太敏感的场景,如新闻资讯详情查询。
- 布隆过滤器:
一致性哈希分布不均
- 问题理解:一致性哈希算法在节点较少时,可能会出现数据分布不均匀的情况,导致部分节点负载过高,而部分节点负载过低,影响系统整体性能。
- 解决方案:
- 虚拟节点:引入虚拟节点,将每个物理节点映射为多个虚拟节点,在计算哈希值时,对虚拟节点进行操作,这样可以使数据分布更加均匀。例如,每个物理节点映射为100个虚拟节点,哈希环上有更多的点可供分配,从而使数据分布更均匀。
- 优缺点及适用场景:
- 虚拟节点:
- 优点:能有效解决一致性哈希分布不均的问题,提高系统整体性能和资源利用率,在增加或减少节点时,数据迁移量相对较小。
- 缺点:增加了系统的复杂性,需要维护物理节点和虚拟节点的映射关系;虚拟节点过多会增加内存消耗。
- 适用场景:适用于对系统性能和扩展性要求较高的大规模分布式缓存系统,如大型电商的分布式缓存集群。
- 虚拟节点: