快手Java后端一面面经
面试题目
- 自我介绍
- 讲讲Java反射
- 讲讲AOP与动态代理
- 项目中如何通过AOP和注解实现滑动窗口限流
- 为什么选择令牌桶算法?具体流程如何?
- Redis基础数据类型及底层实现
- Redission分布式锁实现原理
- 指数退避算法实现及其应用场景
- 如何保障接口幂等性
- 指数退避与均匀重传的区别与选型
- JMM(Java内存模型)详解
- RocketMQ如何保证消息不丢失
- RocketMQ延迟消息原理
- 项目中Redis实现会话管理的细节
- AI调用Function Calling出现幻觉如何解决
- 了解MCP吗?与Function Calling的区别
- AI生成代码的质量保障与Code Review流程
- 算法题:LeetCode 215 数组中第K个最大元素
- 未来规划(考研还是就业)
- 反问环节
参考解析
- AOP与动态代理:JDK动态代理基于接口,使用
Proxy类和InvocationHandler;CGLIB基于继承,通过生成子类拦截方法。Spring默认在单例Bean中使用,通过切面(Aspect)注入逻辑。 - Redis限流:滑动窗口通常使用Redis的
ZSET存储请求时间戳,移除超出时间窗的数据并计数。令牌桶则使用Lua脚本配合LIST或ZSET实现速率控制。 - RocketMQ可靠性:生产端采用同步发送+重试机制;Broker端需配置同步刷盘(Sync Flush)和主从复制(Sync Replication);消费端需手动ACK确认。
- 指数退避:指重试等待时间呈指数级增加(如2s, 4s, 8s),有效防止高并发下下游服务雪崩;均匀重传适用于轻负载场景,避免因排队过久影响用户体验。
- LeetCode 215:推荐使用快速选择算法(Quick Select)或小顶堆实现。快速选择平均时间复杂度为O(N),空间复杂度O(1),是解决Top K问题的标准做法。