面试题答案
一键面试缓存雪崩
- 产生原因:
- 大量缓存数据在同一时间过期,导致这些数据的请求同时绕过缓存直接访问数据库,瞬间给数据库带来巨大压力,可能使数据库崩溃。比如电商大促活动后,大量商品的缓存同时过期,后续对商品信息的请求都直接落到数据库上。
- 解决方案及优缺点:
- 方案一:设置不同的过期时间
- 优点:简单易行,不需要引入额外复杂的系统或技术。通过随机设置缓存过期时间,避免大量缓存同时过期,能有效减轻数据库瞬间压力。
- 缺点:不能完全避免缓存雪崩问题,只是降低其发生概率。并且如果随机范围设置不合理,仍可能有较多缓存集中在某个时间段过期。
- 方案二:使用二级缓存
- 优点:当一级缓存失效时,二级缓存可以作为备用,继续提供数据服务,进一步降低对数据库的访问压力。同时在一定程度上可以提高系统的容错性和可用性。
- 缺点:增加了系统的复杂性和维护成本,需要额外管理二级缓存的存储、更新等操作。并且会占用更多的内存等资源。
- 方案三:加锁排队
- 优点:当缓存失效时,通过加锁让请求排队,依次去查询数据库并更新缓存,确保同一时间只有一个请求访问数据库,避免大量请求同时压垮数据库。
- 缺点:性能会受到一定影响,因为请求需要排队等待,会增加响应时间。如果锁粒度控制不好,可能出现死锁等问题。
- 方案一:设置不同的过期时间
缓存穿透
- 产生原因:
- 应用程序请求的数据在缓存和数据库中都不存在,导致请求每次都绕过缓存直接访问数据库。恶意攻击者可能利用这种情况,使用不存在的 key 频繁请求,使数据库压力过大甚至宕机。例如查询一个不存在的商品 ID 对应的商品信息。
- 解决方案及优缺点:
- 方案一:布隆过滤器
- 优点:能高效判断数据是否存在,在请求访问数据库前,通过布隆过滤器快速过滤掉不存在的数据请求,极大减少对数据库的无效访问。空间效率和查询时间都远远超过一般的算法。
- 缺点:布隆过滤器存在误判率,即可能把不存在的数据判断为存在,但可以通过调整布隆过滤器的参数来降低误判率。并且当数据动态变化时,维护布隆过滤器的成本较高。
- 方案二:缓存空值
- 优点:简单直接,对于查询不存在的数据,也将其缓存(值可以设为一个特殊标识),下次相同请求直接从缓存获取,避免重复访问数据库。
- 缺点:会占用额外的缓存空间,如果空值缓存过多,可能影响缓存命中率和缓存性能。并且如果数据是动态变化的,空值缓存的过期时间设置不好,可能导致新数据写入后,由于空值缓存未过期而无法及时获取到。
- 方案一:布隆过滤器
缓存击穿
- 产生原因:
- 热点数据的缓存过期瞬间,大量请求同时访问该数据,由于缓存失效,这些请求都直接访问数据库,给数据库带来巨大压力。比如某热门商品的缓存过期,而大量用户同时在查询该商品的信息。
- 解决方案及优缺点:
- 方案一:互斥锁
- 优点:和缓存雪崩中加锁排队类似,在缓存过期时,只允许一个请求去查询数据库并更新缓存,其他请求等待,从而避免数据库瞬间承受过多压力。实现相对简单。
- 缺点:同样会影响性能,请求需要等待,增加响应时间。锁的粒度和使用不当可能引发死锁等问题。
- 方案二:永不过期
- 优点:对热点数据设置永不过期,避免了因缓存过期导致的缓存击穿问题,保证高并发情况下对热点数据的快速访问。
- 缺点:数据更新不及时,如果热点数据发生变化,可能需要额外的机制去更新缓存,否则会导致数据不一致。并且会一直占用缓存空间。
- 方案三:热点数据更新缓存提前通知
- 优点:在热点数据过期前,提前通知相关服务更新缓存,保证缓存一直有效,避免缓存击穿。可以在一定程度上减少对数据库的压力,同时保证数据的及时性。
- 缺点:实现起来相对复杂,需要额外搭建通知机制,并且对通知的可靠性和及时性要求较高。如果通知出现问题,仍可能出现缓存击穿。
- 方案一:互斥锁