后端岗位面试题更新 2026-08-05

在优化首页加载速度时,你结合了 Spring Scheduler 定时任务和分布式锁,那么请从底层机制的角度说明定时任务的执行流程,并分析在这个场景中分布式锁具体解决了什么问题。

后端开发技术原理方案权衡问题排查JavaRedisRedisson

考察说明

考查候选人能否准确描述 Spring Scheduler 的调度机制和分布式锁在防止重复执行中的作用,以及如何联合使用它们解决缓存刷新或预加载问题。

回答思路

  1. 【回答框架 1】Spring Scheduler 的定时任务基于线程池异步执行:调度器根据 cron 表达式或固定延迟计算出触发时间,由调度线程在时间到达时提交任务到线程池,线程池分配线程执行。默认核心线程数为 1,任务执行时长超过间隔可能导致错过后续触发。
  2. 【回答框架 2】在首页加载慢的场景中,定时任务通常用于预热或刷新首页缓存,例如提前从慢数据源加载热点数据到 Redis。如果多个应用实例同时执行任务,会导致重复计算和重复写入,浪费资源并可能引发数据不一致。
  3. 【回答框架 3】分布式锁的互斥作用:在执行任务前,各实例尝试获取锁,只有成功的实例才继续执行,其余实例等待或跳过。这保证了在同一时刻只有一个实例执行预热任务,从而避免资源竞争。注意:锁只能保证互斥,不代表幂等,如果业务重复处理仍可能产生副作用。
  4. 【回答框架 4】获取锁后可配合 Double Check:拿到锁后再次检查缓存是否存在或版本号是否已更新,若其他实例已完成则直接跳过,这种方式能进一步减少无畏的计算。
  5. 【回答框架 5】异常处理方面:任务执行过程中如果抛异常,Spring Scheduler 默认会终止该任务,但不会影响下一次调度;需要自行记录日志并考虑重试机制。分布式锁需设置合理超时时间,防止死锁,并要考虑锁过期后任务未完成的问题,通常使用 Redisson 的看门狗自动续期。
  6. 【关键点 1】Spring Scheduler 基于线程池异步调度任务,默认单线程,需注意任务阻塞和线程耗尽。
  7. 【关键点 2】分布式锁的核心作用是互斥,保证同一任务在同一时刻仅被一个实例执行。
  8. 【关键点 3】锁保证互斥,不保证幂等,业务幂等需额外设计唯一标识或状态记录。
  9. 【关键点 4】合理设置锁超时和续期策略,避免锁永久占用或续期导致长时间独占。
  10. 【关键点 5】结合多级缓存和预加载策略,可以显著减少首页数据库压力。
  11. 【易错点 1】锁超时设置太短,任务未完成锁就释放,其他实例可能并发执行,破坏互斥。
  12. 【易错点 2】定时任务执行时长大于调度周期可能导致任务堆积或错过触发。
  13. 【易错点 3】分布式锁误以为能解决幂等,实际还需业务层面的去重和状态标记。