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