途牛暑期实习一面面经
本文最后更新于9 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
  1. 自我介绍
  2. 你这个AI Agent是怎么实现的
  3. 项目亮点有哪些
  4. redis分布式锁原理?Setnx ex SET key value NX EX expireTime
  5. setnx会有哪些问题?不可重入 不可重传(重试)/非阻塞 x超时释放/不可续期 主从一致性
  6. 自己实现的锁还是用的框架?自己实现:redis+lua + setnxex 框架 redisson(已解决续期、重入、公平锁、WatchDog等问题)
  7. redission锁逻辑?lua脚本保证原子性 + watchdog自动续期 + 解锁判断value是否一致bylua以确保不误删其他线程锁
  8. JUC常见并发容器?java.util.concurrent包括
    • ConcurrentHashMap:分段锁/CAS
    • CopyOnWriteArrayList:写时复制
    • CopyOnWriteArraySet
    • ConcurrentLinkedQueue
    • ConcurrentSkipListMap:跳表实现的有序Map
    • BlockingQueue:阻塞队列,如LinkedBlockingQueue、ArrayBlockingQueue
  9. hashmap有了解吗,为什么线程不安全?不知道,只知道要用concurrentHashmap解决
    • JDK 8+: 多线程环境下,多个线程可能同时对HashMap进行put操作,可能引发数据覆盖或死循环(未加锁的桶插入)。
    • JDK1.7 中使用数组 + 链表,扩容时可能导致环形链表,造成Entry链表死循环(CPU 100%)
    • 可见性问题:resize后部分线程可能读到旧table?
    • 不是线程安全的,需要使用Collections.synchronizedMap()或ConcurrentHashMap等替代
  10. concurrentHashmap怎么解决线程不安全?不了解
    • JDK1.7 采用Segment分段锁机制,每段用一个ReentrantLock控制。
    • JDK1.8 采用CAS + synchronized + Node数组+链表/红黑树结构:
    • put时使用CAS保证头节点更新原子性;
    • 链表长度超过8时转为红黑树;
    • synchronized锁住某个桶而非整个Map。
    • 扩容时协助迁移(多线程协同)?
    • size() 使用 LongAdder 思想减少冲突?
  11. Spring IOC AOP简单介绍
    • IoC(控制反转):将对象的创建、依赖的维护交给Spring容器管理,实现解耦。
    • AOP(面向切面编程):将日志、事务等横切关注点从业务逻辑中分离出来,用切面织入目标方法前后。实现:动态代理(JDK Proxy/CGLIB)织入增强逻辑
  12. IOC用到了什么设计模式?面向对象模式
    IoC 容器常用设计模式:
    • 工厂模式:创建对象(BeanFactory / ApplicationContext)
    • 单例模式:默认bean是单例的
    • 代理模式:AOP 动态代理
    • 模板方法模式:如JdbcTemplate,BeanPostProcessor 定义初始化钩子
    • 策略模式:依赖注入的实现(构造器/Setter)
    • 是面向对象的,但更偏向解耦设计与控制反转原则
  13. springboot和spring区别?可以实现快速配置
    • Spring是一个全家桶框架,需要手动配置。
    • Spring Boot是对Spring的封装,提供自动配置、starter模块、嵌入式服务器(如Tomcat),大幅提升开发效率。
    • 通过starter快速集成各种功能,如spring-boot-starter-web、spring-boot-starter-data-jpa
  14. springboot怎么实现快速启动?Starter
    • Starter机制:打包常用依赖(如spring-boot-starter-web),META-INF/spring.factories 自动加载配置类
    • 内嵌容器:将Tomcat作为库引入,无需外部部署
    • Auto-Configuration:条件注解(@ConditionalOnClass)按需加载Bean
  15. spring常用注解? @autowired @component @service @configuration
  16. mysql索引底层数据结构:B+树 相比其他数据结构优势
    • 索引使用B+树而非Hash、红黑树。
    • 优势:
    o 所有数据存在叶子节点,有序,便于范围查询,查询稳定性更好。
    o 每个节点包含大量关键字,减少IO次数。
    o 通过有序链表连接所有叶子节点,加速范围查询
  17. 聚簇索引和非聚簇索引的区别:一个要回表查询另一个不要
    特性 聚簇索引 非聚簇索引
    数据存储 叶子节点存整行数据 叶子节点存主键ID
    数量 每表仅1个 可多个
    回表 无需回表 需回主键索引查数据(除非覆盖索引)
    • 聚簇索引(Clustered Index):表数据存储在索引结构中(如 InnoDB 主键索引)。
    • 非聚簇索引(Secondary Index):索引记录的是主键值,需要回表查数据。
    • 回表:使用辅助索引查到主键后,还需回到聚簇索引查真实数据。
  18. 讲一下回表:当查询的列未被非聚簇索引覆盖时:通过非聚簇索引找到主键值,到聚簇索引中查找整行数据
  19. MVCC有了解吗怎么实现:undolog+ redolog 隐式字段、undolog日志、readView
  20. mysql优化思路:用explian命令
    • 定位慢查询(开启慢日志或监控工具)
    • 使用EXPLAIN分析执行计划:关注type访问类型key,使用索引,Extra(Using filesort/Using temporary)
    • 创建合适索引(联合索引/覆盖索引);
    • 避免使用SELECT *、!=、OR等;
    • 合理分库分表;
    • 参数调优(如join_buffer_size、sort_buffer_size);
    • 慎用子查询,优先使用JOIN。
  21. redis持久化机制?RDB AOF
    机制 原理 优点 缺点
    RDB 定时生成内存快照 恢复快,文件小 可能丢失最后一次快照后的数据
    AOF 追加写操作日志 数据安全(可配置fsync策略) 文件大,恢复慢
  22. 你的项目里用到了上面中的哪个?不知道
  23. rabbitMQ延迟队列介绍下?
    • 延迟队列实现方式:
    • 使用 TTL + 死信交换机(DLX);
    • 或者使用插件rabbitmq_delayed_message_exchange实现精准延迟;
    • 消息设定过期时间,过期后转发到死信队列,消费者从中消费延迟消息。
  24. springcloud组件?五个
    • Eureka / Nacos(服务注册与发现)
    • Ribbon / LoadBalancer(客户端负载均衡)
    • Feign(声明式HTTP调用)
    • Hystrix / Resilience4j(服务熔断)
    • Gateway / Zuul(网关)
  25. 为什么服务注册不用zk?服务注册组件有了解吗
  26. nacos有了解吗
    • ZooKeeper基于CP模型,一致性强,但性能低,注册服务时需等待半数以上节点应答,不适合高可用性要求。
    • Nacos是AP/CP可切换(临时实例用AP,配置用CP),启动快、配置简洁、支持动态配置和注册。
    •关于Nacos面试高频考点合集https://zhuanlan.zhihu.com/p/31453507349
  27. linux和docker有了解吗
  28. docker进入后台的命令:docker -exec docker exec -it /bin/bash
  29. docker怎么挂载的 挂载命令是什么:mount docker run -v /host/path:/container/path …
  30. linux如果CPU飙升怎么排查?top命令 找到pid jstaus找到具体哪一行
    • top # 找到高CPU进程PID
    • ps -mp -o THREAD,tid,time,%CPU
    • jstack # 找到哪个线程在消耗资源
  31. 线程池有使用过吗,怎么使用的:Threadlocal Executor
  32. 核心线程数最大线程数怎么配的:默认的
    核心线程数:CPU密集型 = N+1,IO密集型 = 2N
    o 使用Executors.newFixedThreadPool()或ThreadPoolExecutor;
    o 设置核心线程数、最大线程数、队列大小、拒绝策略;
    new ThreadPoolExecutor(
    10, 30, 60, TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(100),
    Executors.defaultThreadFactory(),
    new ThreadPoolExecutor.AbortPolicy()
    );
  33. 如果最大线程数30,有500个消息待消费怎么办,会出现什么问题?只答要看queue类型,不清楚具体policy和handle
    o 超过线程和队列容量后将触发拒绝策略。
    o 默认策略是AbortPolicy,会抛出异常。
    o 可选策略:
    • CallerRunsPolicy:主线程执行
    • DiscardPolicy:丢弃任务
    • DiscardOldestPolicy:丢弃队头任务
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇