51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在好未来系统中,课程信息(如课程名称、价格、教师信息)需要被频繁访问(QPS约5000),且更新频率较低(每天调整1-2次)。请设计缓存策略,说明如何处理缓存击穿(热点数据突然失效)、缓存雪崩(大量缓存同时失效),并说明分布式锁的实现(如Redis分布式锁)。

好未来Java难度:中等

答案

1) 【一句话结论】:针对课程信息高频访问(QPS约5000)、低更新频率(每天1-2次)的场景,采用**多级缓存(本地+分布式)**结合分布式锁,通过预加载/互斥锁处理缓存击穿,随机过期/热备份应对缓存雪崩,用Redis SETNX+EXPIRE实现分布式锁,确保高并发下数据一致性。

2) 【原理/概念讲解】:

  • 缓存击穿:指热点数据缓存过期后,大量请求直接访问数据库,导致性能骤降。类比“热门电影票突然下架,所有想购票用户同时访问官网,官网服务器瞬间崩溃”。处理方法:预加载(如每天凌晨更新缓存)或加互斥锁(确保同一时间仅一个线程查数据库并更新缓存)。
  • 缓存雪崩:指大量缓存同时失效,所有请求都去数据库,服务器压力激增。类比“所有热门商品同时下架,所有用户同时抢购,服务器瞬间宕机”。处理方法:随机设置缓存过期时间(避免集中失效)或为热点数据做热备份(多个节点缓存同一数据)。
  • 分布式锁:用于分布式系统中保证资源访问的互斥性,防止并发问题。类比“超市购物车限购,只有一人能加锁抢购,其他人等待”。实现上,通常用Redis的SETNX(设置键值,若键不存在则返回1)结合EXPIRE(设置过期时间),确保锁的原子性和时效性。

3) 【对比与适用场景】:

对比项缓存击穿缓存雪崩分布式锁 vs 本地锁
定义热点数据缓存过期,大量请求访问数据库大量缓存同时失效,请求全部去数据库分布式系统资源互斥访问
处理方式预加载、互斥锁随机过期、热备份Redis SETNX+EXPIRE
适用场景热点数据,更新频率低缓存集群,避免集中失效分布式系统,跨进程/节点
注意点需优化锁粒度(如粗粒度锁或本地缓存)需热备份或随机过期锁值唯一性、过期时间动态调整

4) 【示例】(伪代码):

public Course getCourseInfo(String courseId) {
    // 1. 本地缓存优先
    Course course = localCache.get(courseId);
    if (course != null) return course;
    
    // 2. 分布式缓存
    course = redisCache.get(courseId);
    if (course != null) {
        localCache.put(courseId, course); // 回写本地缓存
        return course;
    }
    
    // 3. 缓存未命中,加分布式锁
    String lockKey = "course:" + courseId + ":lock";
    String lockValue = UUID.randomUUID().toString();
    try {
        // 尝试加锁
        if (redis.setnx(lockKey, lockValue, 10, TimeUnit.SECONDS)) {
            // 加锁成功,查数据库
            course = db.queryCourse(courseId);
            if (course != null) {
                // 更新缓存
                redis.set(courseId, course, 3600); // 1小时过期
                localCache.put(courseId, course);
            }
        } else {
            // 加锁失败,等待重试
            Thread.sleep(100);
            return getCourseInfo(courseId);
        }
    } catch (Exception e) {
        throw new RuntimeException("获取课程信息失败", e);
    } finally {
        // 释放锁
        if (redis.exists(lockKey) && redis.get(lockKey).equals(lockValue)) {
            redis.del(lockKey);
        }
    }
    return course;
}

5) 【面试口播版答案】:面试官您好,针对课程信息高频访问(QPS约5000)、低更新频率(每天1-2次)的场景,我会设计如下缓存策略:首先,采用多级缓存(本地缓存+分布式缓存),本地缓存(如ConcurrentHashMap)用于高频访问,分布式缓存(如Redis)用于数据持久化,减少数据库压力。针对缓存击穿(热点数据缓存过期,大量请求访问数据库),通过预加载(如每天凌晨更新缓存)或互斥锁(加分布式锁,确保同一时间仅一个线程查数据库并更新缓存)处理;针对缓存雪崩(大量缓存同时失效,请求全部去数据库),用随机过期时间(避免集中失效)或热点数据热备份(多个节点缓存同一数据)。分布式锁用Redis的SETNX+EXPIRE实现,保证加锁的互斥性,并设置10秒过期时间防止死锁。具体流程:获取课程信息时,先查本地缓存,再查分布式缓存,缓存未命中时加分布式锁,查数据库后更新缓存。这样既能保证高并发下的性能,又能避免缓存失效导致的服务雪崩。

6) 【追问清单】:

  • 问:如何处理缓存穿透?答:用布隆过滤器或缓存空值(设置过期时间,避免无效请求穿透)。
  • 问:分布式锁的过期时间怎么设置?答:根据业务逻辑,比如10秒,防止线程阻塞,同时避免死锁。
  • 问:缓存更新策略是什么?答:异步更新(如消息队列),避免阻塞请求,提高系统吞吐量。

7) 【常见坑/雷区】:

  • 错误:分布式锁不设置过期时间,导致死锁(线程一直持有锁,无法释放)。
  • 错误:缓存击穿时没有加锁,导致多个线程同时查数据库,数据库压力激增。
  • 错误:缓存雪崩时没有随机过期时间,导致集中失效,服务器宕机。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1