爱学习Java后端日常一面
《面试题目》
- 一、个人与基础问题
- 做个自我介绍
- 为什么学Java后端?
- 项目是自己做的还是跟别人?
- 前端技术栈知道哪些?
- Redis、MySQL、ES等中间件怎么部署?
- Git、Linux命令掌握情况?
- 项目能不能远程演示?
- 二、项目技术问题
- 用户表结构怎么设计?
- 实名认证怎么做的?对接了哪家?
- ES在项目里用来干嘛?存了什么?
- 分布式锁的本质是什么?
- 哪些技术可以实现分布式锁?
- 不用Redis怎么实现分布式锁?
- MySQL能不能做分布式锁?怎么做?
- Redis有哪些数据结构?各自用途?
- 看代码题:10线程count++,用volatile有什么问题?
- volatile关键字作用是什么?
- 什么是指令重排?
- 怎么修复count++问题,保证结果正确?
- 滑动窗口+Redisson怎么防止短信接口被刷?
- 大量不同号码一分钟各刷一次怎么防?
- 身份证加密存储,怎么实现模糊搜索?
《参考解析》
-
MySQL深度:MySQL InnoDB使用B+树索引,支持ACID事务。关键知识点:聚簇索引(主键索引)叶节点存完整行数据;辅助索引叶节点存主键值(需回表);MVCC通过undo log版本链+ReadView实现多版本并发控制,解决脏读/不可重复读;事务隔离级别从低到高:读未提交→读已提交→可重复读(默认)→串行化。
-
Redis核心:Redis常用数据结构:String/Hash/List/Set/ZSet。持久化:RDB(定期快照,恢复快,数据可能丢失)和AOF(追加日志,数据安全,文件大)。缓存穿透用布隆过滤器;缓存雪崩加随机过期时间+多级缓存;缓存击穿用互斥锁或逻辑过期。分布式锁用SET key value NX PX + Lua脚本保证原子释放。
-
Java并发:Java并发:synchronized关键字(偏向锁→轻量级锁→重量级锁升级);ReentrantLock(可重入、可中断、公平锁);volatile(内存可见性+禁止指令重排,不保证原子性);CAS(Compare-And-Swap,无锁乐观并发);ThreadLocal(线程本地变量,WeakReference,注意内存泄漏)。线程池核心参数:corePoolSize/maximumPoolSize/keepAliveTime/workQueue/handler。