阿里一面考点分析总结

阿里一面考点分析总结
最新回答
暖妹

2022-01-18 08:24:23

阿里一面考点主要围绕缓存相关问题展开,涵盖缓存穿透、缓存击穿、缓存雪崩以及热点数据集中失效等场景及其解决办法。以下为详细分析:

缓存穿透
  • 定义:查询一条数据库中根本不存在的数据,导致缓存和数据库都未命中,请求直接打到数据库。
  • 问题:恶意攻击者可能利用不存在的ID频繁查询,导致数据库压力过大甚至宕机。
  • 解决办法

    缓存空值:将不存在的key缓存为null,并设置过期时间,避免重复查询数据库。

    BloomFilter:在缓存前加一层BloomFilter,判断key是否存在。不存在则直接返回,存在再查询缓存和数据库。

    方案选择

    针对恶意攻击(key异常多、重复率低),优先使用BloomFilter过滤。

    针对空数据key有限且重复率高的场景,使用缓存空值方案。

缓存击穿
  • 定义:高并发系统中,大量请求同时查询一个失效的key,导致请求直接打到数据库。
  • 问题:数据库请求量剧增,可能引发性能瓶颈或宕机。
  • 解决办法:使用互斥锁。第一个查询请求获取锁后查询数据库并更新缓存,其他请求等待锁释放后直接读取缓存。
缓存雪崩
  • 定义:大规模缓存同时失效(如缓存服务宕机),导致请求直接打到数据库。
  • 问题:数据库无法承受突发流量,可能崩溃。
  • 解决办法

    事前:使用集群缓存(如Redis主从+哨兵、Redis Cluster)保证高可用。

    事中

    本地缓存(如ehcache)作为备用,在Redis不可用时支撑请求。

    限流降级(如Hystrix),限制请求流量并调用降级组件返回默认值。

    事后:开启Redis持久化机制,重启后自动加载数据恢复缓存。

热点数据集中失效
  • 定义:热点数据缓存同时失效,导致大量请求打到数据库。
  • 解决办法

    设置不同失效时间:在基础时间上加减随机值,使失效时间错开。

    互斥锁:第一个查询请求加锁后更新缓存,其他请求等待锁释放。需权衡吞吐量下降的影响。

业务系统调用流程
  • 常规流程:查询数据时先查缓存,命中则返回;未命中则查数据库并更新缓存。

总结
  • 核心考点:缓存穿透、击穿、雪崩的场景识别与解决方案,以及热点数据失效问题的处理。
  • 关键能力:理解缓存机制在高并发场景下的作用,掌握常见问题的优化手段(如空值缓存、BloomFilter、互斥锁、集群部署等)。
  • 延伸学习:可进一步研究Spring、MyBatis、Netty源码,以及高并发、分布式架构的原理。