平安壹钱包-技术中心-Java技术一面review
1. 比较擅长的点?
数据结构和算法 多线程并发(Object volatile sync lock 线程池) mysql
1.1 mysql是怎么学的?学的比较擅长?
毕业后mysql的增删改查都ok 学过极客时间的MySQL实战45讲 学习了所有的基础篇并且写了读书笔记
包括:MySQL的基础架构 索引 事务隔离级别 MVCC多版本并发控制(事务ID和回滚操作undo log)
可重复读隔离级别实现:MVCC+行锁(查询:一致性读 和 更新:快照读)
1.2 工作中大概哪些知识点会用到的?与工作结合
有一次线上故障review:龙哥多线程插入数据,先删数据 再插数据(数据有的话 我先删了再插)
知识点:
涉及行锁(共享锁S 排它锁X)意向锁/表锁(IS意向共享锁 IX意向排它锁)间隙锁(Grap Lock)插入意向锁(Insert Intention Locks)
① session1和session2都获取到了排他锁IX(表级锁)、gap锁(行级锁)
② 都等待rec insert intention(插入意向锁)
③ 插入意向锁与gap锁冲突,双方都没有释放gap锁,又都在等待插入意向锁,死锁发生。
话外:
InnoDB行锁是通过「给索引上的索引项加锁来实现的」,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。
InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
索引分为主键索引和二级索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;
如果一条语句操作了二级索引,MySQL会先锁定该二级索引,再锁定相关的主键索引。
1.3 一条更新记录:张三改成李四(主键id、手机号字段) dao到数据层发生了什么?
mysql的基础架构 回表操作 MVCC
1.4 版本链底层是什么?
事务ID+回滚日志(undo log)
2. 多线程并发的知识?
Object volatile sync lock 线程池
lock底层原理:AQS (state状态来控制锁获取和释放状态,用一个双向链表来维护挂起的线程)
① 公平锁和非公平锁的实现:ReentrantLock(boolean fair)
底层:ReentrantLock(Sync属性 extend AQS) NonfairSync()会先进行一个CAS操作,将一个state状态从0设置到1,也就是非公平锁的“插队”操作
② state变量是一个volatile修饰的int类型变量,这样就保证了这个变量在多线程环境下的可见性
state状态就是用来管理是否获取到锁的一个同步状态,0代表锁空闲,1代表获取到了锁
③ 锁重入实现:state不为0时 判断当前线程是否为锁占用线程,也就是同一个线程多次获取锁,是就将state+1
3. @Transational 与 spring 注解默认参数?传播途径?
AOP原理再学一学?内部原理
通过动态代理生成代理类,调用的是这个代理类重写的代理方法 invoke
Subject subject = (Subject) Proxy.newProxyInstance(loader, interfaces, handler);
因为JDK生成的最终真正的代理类,它继承自Proxy并实现了我们定义的Subject接口,
在实现Subject接口方法的内部,通过反射调用了InvocationHandlerImpl的invoke方法。
4. 幂等性接口设计?
业务场景:业务上游定时推送商品信息,系统对外暴露dubbo接口,参数包括幂等性ID,这个字段设置成唯一索引,接口实现为先查后插。
—— B端的接口幂等设计
不足:两个重复请求 第二次请求汇报唯一索引冲突!
解决:Redis实现分布式锁,setNx(key,value) 第一次请求插入成功获取锁,第二次请求阻塞;
setNx键值对 expire超时时间 del键 保证setNx和expire操作的的原子性
引申:
redis如何保证原子性?存在setNx和expire的原子操作
超时时间失效 业务还没执行完? 新的redis工具 有个看门狗机制 守护线程监听,不断的给锁加时间 —— C端的设计
线程池使用tips: execute(无返回值)submit(返回submit对象 存储着返回数据 调用get方法获取结果 会阻塞住直到任务完成)
5. 现有的开发总体流程?
略.
6. 发布过程中 如何保证服务调用的是新上线的服务?
不知道..
7. 下一家公司/工作偏向什么? (结合当前面的部分说!)
已经熟练掌握了B端的业务流程的开发 想进一步拓展和深入自己的技术 比如在:高并发 高可用 因为自己很喜欢学习技术 也学习了蛮久 但是并没有实际运用
开发嘛 很注重实践 也很注重不断学习 希望下一份工作能有不一样的挑战 包括:技术上 业务上!
---
高谦虚同学:因为我在现公司已经熟练地掌握了工作技能和知识,虽然更长久的工作可以巩固我的技术,但是我希望能进一步拓宽我的视野和技能。
在接下来的寻找工作的过程中,我会利用我已知的知识为公司创造价值,但我更希望能有新技术的学习及应用机会,因为我们这个行业是一个知识刷新迭代很快的行业,我也希望能做一个一直在进步的人才。
8. 接下来的规划?
近期的打算:自己很喜欢网上的一个大佬 北邮的 他写了一个很全面的关于后端技术栈的博客 现在再跟着学习+回顾 并记录笔记
包括:Java基础、进阶、高并发、jvm、spring、mybatis、redis、kafka、mysql、算法等
学完之后
1~2年的打算:深入学习多线程并发+应用 MySQL+应用 深入到底层! 同时积累自己的业务能(目前以我的视野 我觉得这些很重要)
9. 反问环节
部门的主要业务?
三方支付 支付业务 核心系统研发部 基础服务 调用量比较大
环境隔离 提高查询效率 功能兼容性 降级策略
部门的偏重的技术栈?
springboot dubbo MySQL Redis mq 互联网主流的技术
业务上线保证策略/手段?