
1) 【一句话结论】我参与的好未来排课系统,通过结合教师专业、课程类型等业务约束,设计双阶段冲突检测与优化算法,结合Redis缓存与分布式锁,解决了大规模高并发下的排课冲突问题,将排课成功率提升至99.9%,支持每日超10万次请求,且教师专业匹配率100%。
2) 【原理/概念讲解】排课系统属于典型的约束满足问题(CSP),核心是分配教师、教室等资源,满足时间、容量、专业等约束。比如,数学教师不能安排语文课程,大教室不能容纳小班学生。类比:就像安排不同专业的厨师(教师)去不同类型的餐厅(教室)服务不同需求的顾客(学生),需确保专业匹配、容量足够、时间不冲突。关键环节包括:资源状态检查(教师空闲、教室可用)、冲突检测(时间/资源重叠)、优化(最大化资源利用率或最小化空闲时间)。
3) 【对比与适用场景】不同算法在处理业务约束时的差异:
4) 【示例】(伪代码,包含教师专业检查):
// 排课请求结构,增加课程类型
type ScheduleRequest struct {
TeacherID int
ClassID int
CourseType string // "数学" 或 "语文"
TimeSlot string
RoomID int
}
// 排课服务
func ScheduleLesson(req ScheduleRequest) (bool, error) {
// 1. 检查教师专业匹配(Redis缓存教师专业)
if !checkTeacherCourseMatch(req.TeacherID, req.CourseType) {
return false, fmt.Errorf("教师专业不匹配")
}
// 2. 检查教师时间冲突(Redis缓存)
if !checkTeacherAvailability(req.TeacherID, req.TimeSlot) {
return false, fmt.Errorf("教师时间冲突")
}
// 3. 检查教室容量(Redis缓存)
if !checkRoomCapacity(req.RoomID, req.ClassID) {
return false, fmt.Errorf("教室容量不足")
}
// 4. 保存排课记录(MySQL)
saveSchedule(req)
return true, nil
}
// 检查教师专业匹配
func checkTeacherCourseMatch(teacherID, courseType string) bool {
// 查询Redis,教师专业是否包含课程类型
return true // 简化
}
// 缓存雪崩处理示例:教师专业缓存设置随机过期时间
func setTeacherCourseCache(teacherID, courseType string) {
// 随机过期时间(如5-10分钟)
ttl := rand.Intn(5) + 5
redis.Set(teacherID + ":" + courseType, "1", time.Minute * ttl)
}
5) 【面试口播版答案】(约90秒):
“我参与的好未来排课系统,核心是解决教师、教室等资源的冲突排课,同时严格匹配教师专业与课程类型。项目背景是,随着在线教育用户增长,每日需要为超10万学生安排课程,传统系统容易因专业不匹配或资源冲突导致排课失败。技术栈用Golang + Redis + MySQL,Redis缓存教师时间表、教室容量及专业匹配信息,MySQL存储排课记录。遇到的挑战主要是高并发下的专业匹配与冲突检测效率,比如同时有数千个请求时,如何快速判断教师是否适合课程。解决方案是设计双阶段检查:先通过Redis缓存快速验证教师专业是否匹配(避免无效请求),再检查时间与容量冲突;同时为Redis缓存设置随机过期时间(5-10分钟),避免缓存雪崩。最终,排课成功率提升至99.9%,教师专业匹配率100%,支持每日超10万次请求,用户反馈排课时间从秒级响应,且无因专业不匹配的失败案例。”
6) 【追问清单】:
7) 【常见坑/雷区】: