快手Java后端一面面经
面试题目
- 自我介绍
- AI项目背景与目的
- 系统限制:最大视频大小、解析输出格式
- 音频处理链路与大模型调用流程
- MD5+分布式锁内容去重方案
- Redis分片状态设计及分片大小设置依据
- 超卖问题的最终一致性保障
- Redis缓存击穿方案及选择逻辑过期原因
- 失败重试次数上限后的兜底策略
- 延迟队列处理超时订单,乐观锁解决支付冲突
- Redis持久化配置
- MQ消息积压或消费者消费不过的处理监控与方案
- 索引失效导致全表扫描的排查与解决
- 本地线程池核心参数评估与设置
- Lua脚本扣库存原子性与极端挂机场景分析
- MySQL隔离级别及乐观锁表现区别
- MinIO残余分片文件清理策略
- 服务宕机时前端用户感知处理
- HashMap在并发场景下的线程安全问题
- 查询“最近上传的10个视频”的Redis数据结构选型
- Redisson看门狗续期机制与锁释放
- MyBatis #与$占位符区别及防SQL注入
- 流量突增10倍后的瓶颈分析
- 算法题(未写出,仅讲思路)
- 心态与自我复盘
参考解析
- Redis缓存击穿与逻辑过期:逻辑过期通过缓存设置一个过期时间字段,更新时由后台线程异步刷新,避免了互斥锁导致的线程阻塞,适合对实时性要求不高但要求高性能的场景。
- 超卖与一致性:核心使用Lua脚本保证扣减原子性,配合Redis分布式锁或数据库乐观锁(版本号/CAS),最终一致性通过MQ实现补偿重试机制。
- 索引失效排查:常见原因有隐式类型转换、非最左匹配原则、使用!=或NULL判断、计算列等。排查工具:使用EXPLAIN命令分析key和type字段。
- MQ消息积压:增加消费者副本数,临时扩容分区;或者增加离线补偿逻辑,将积压消息转存至临时DB,待流量低峰时通过异步任务补齐。
- #与$占位符:#进行预编译处理,能有效防SQL注入;$进行字符串拼接,直接替换,常用于表名或列名动态传入,务必注意过滤。