2021-03-12 10:44:51
百度AIGC后端实习一面主要围绕技术基础、项目经验、数据库、缓存、并发、JVM、限流及开发框架等方面展开,具体内容如下:
自我介绍
需清晰阐述个人教育背景、技术技能、项目经历及与岗位相关的优势,展示对AIGC后端开发的热情与适配性。
权限管理项目
需介绍项目中权限管理的设计思路,如基于RBAC(角色访问控制)模型实现权限分配,通过数据库存储角色-权限关系,结合中间件(如Spring Security)实现动态权限校验,并说明如何解决权限粒度控制、权限继承等具体问题。
Redis使用原因及性能优势
使用原因:Redis作为内存数据库,支持高并发读写,适合缓存热点数据、会话管理等场景;其丰富的数据结构(如Hash、Sorted Set)可灵活应对复杂业务需求。
性能快的原因:数据存储在内存中,减少磁盘I/O;单线程模型避免线程切换开销;基于事件驱动的非阻塞I/O模型(如epoll)提升并发处理能力。
MySQL索引机制
索引通过B+树结构组织数据,加速查询;主键索引(聚簇索引)直接存储数据行,非主键索引(二级索引)存储主键值,需回表查询;覆盖索引可避免回表,提升查询效率。
索引失效场景
违反最左前缀原则(如联合索引未从左列开始查询);
在索引列上使用函数或运算(如WHERE YEAR(date) = 2023);
使用NOT、!=、OR等条件(除非OR条件均使用索引);
索引列参与范围查询后,后续列无法使用索引(如WHERE a > 1 AND b = 2,b索引失效);
数据分布不均(如性别字段仅两种值,索引选择性低)。
MySQL日志类型
Redo Log:记录物理日志(如页修改),用于崩溃恢复,保证事务持久性;
Undo Log:记录逻辑日志(如SQL逆操作),用于事务回滚和MVCC(多版本并发控制)。
并发场景经验
需说明参与过的并发项目,如高并发接口设计、分布式锁实现(如Redis分布式锁)、线程安全控制(如同步锁、CAS操作)等。
JVM模型
需描述JVM内存结构(堆、栈、方法区等)、类加载机制、垃圾回收算法(如标记-清除、复制、标记-整理)及GC调优经验。
Java版本
需明确使用的Java版本(如Java 8/11/17),并说明选择原因(如LTS版本稳定性、新特性支持)。
MyBatis返回主键ID配置
MyBatis配置:在insert标签中设置useGeneratedKeys="true"和keyProperty="id",数据库需支持自增主键(如MySQL的AUTO_INCREMENT)。
与MyBatis-Plus(MP)区别:MP通过@TableId(type = IdType.AUTO)注解简化配置,且提供更丰富的ID生成策略(如雪花算法)。
AOP与IOC介绍
AOP(面向切面编程):通过动态代理实现横切关注点(如日志、事务)的模块化,减少代码重复。
IOC(控制反转):由容器管理对象生命周期及依赖关系,通过依赖注入(DI)降低组件耦合度。
Redis缓存问题及解决方案
缓存击穿:热点Key过期时大量请求直达数据库,可通过互斥锁或逻辑过期解决;
缓存穿透:查询不存在的Key导致请求穿透到数据库,可通过布隆过滤器或缓存空值拦截;
缓存雪崩:大量Key同时过期导致数据库压力激增,可通过随机过期时间或分级缓存缓解。
缓存穿透其他解决方案
除缓存无效Key外,还可通过接口层校验参数合法性(如ID范围限制),或使用默认值缓存(如查询不存在的商品时返回默认商品信息)。
限流解决方案及算法
解决方案:
计数器限流(如Nginx限流模块);
漏桶算法(固定速率处理请求);
令牌桶算法(允许突发流量,如Guava RateLimiter);
分布式限流(如Redis+Lua实现全局限流)。
常用算法:
固定窗口算法;
滑动窗口算法;
令牌桶算法;
漏桶算法。
GC算法
标记-清除:标记无用对象后直接清除,产生内存碎片;
复制算法:将存活对象复制到另一块内存,适合新生代(如Survivor区);
标记-整理:标记后压缩内存,解决碎片问题,适合老年代;
分代收集:结合不同算法处理新生代和老年代(如HotSpot的Serial/Parallel/CMS/G1)。
Java线程池核心参数
corePoolSize:核心线程数,长期存活;
maximumPoolSize:最大线程数,任务队列满时创建;
keepAliveTime:非核心线程空闲存活时间;
unit:时间单位;
workQueue:任务队列(如LinkedBlockingQueue);
threadFactory:线程工厂;
handler:拒绝策略(如AbortPolicy、CallerRunsPolicy)。