2022-01-18 08:24:23
阿里一面考点主要围绕缓存相关问题展开,涵盖缓存穿透、缓存击穿、缓存雪崩以及热点数据集中失效等场景及其解决办法。以下为详细分析:
缓存穿透缓存空值:将不存在的key缓存为null,并设置过期时间,避免重复查询数据库。
BloomFilter:在缓存前加一层BloomFilter,判断key是否存在。不存在则直接返回,存在再查询缓存和数据库。
方案选择:
针对恶意攻击(key异常多、重复率低),优先使用BloomFilter过滤。
针对空数据key有限且重复率高的场景,使用缓存空值方案。

事前:使用集群缓存(如Redis主从+哨兵、Redis Cluster)保证高可用。
事中:
本地缓存(如ehcache)作为备用,在Redis不可用时支撑请求。
限流降级(如Hystrix),限制请求流量并调用降级组件返回默认值。
事后:开启Redis持久化机制,重启后自动加载数据恢复缓存。

设置不同失效时间:在基础时间上加减随机值,使失效时间错开。
互斥锁:第一个查询请求加锁后更新缓存,其他请求等待锁释放。需权衡吞吐量下降的影响。
