淘宝这边是西溪的用户增长团队,因为是秋招提前批,前两面过了之后需要录系统,我觉得不稳,然后就溜了
一面
Java
1. hashCode的作用
每个实例一个hash值,如果不覆盖则每个对象都不一样。常用来hashMap的桶定位
2. 集合框架
Collection->list,st
Map
Stack和HashTable是线程安全的,ConcurrentHashMap和Cow也是
通过Collections.synchronizedList();
3. AIO和BIO的区别
aio是异步的,bio是阻塞的
Jdk1.4之前是bio,Jdk1.7之后是aio
4. 多线程的ABA问题
通过版本号机制来解决
5. 线程池的执行原理
$$
execute() \rightarrow addWorker()\rightarrow Thread.start() \rightarrow runWorker() \rightarrow getTask() \rightarrow processWorkerExit()
$$
6. Java的内存结构
堆,方法区,本地方法栈,虚拟机栈,程序计数器
7. 什么时候Full GC和Young GC
eden满时是young Cc
old满时是full gc
框架
8. Mybatis的$和#差异
刚开始听成占位符和#的差异了,这个地方交流误区,没听清所以浪费了时间
$:占位符,仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换
#:把传入的值作为字符串,防止SQL注入。解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。
9. Spring bean的生命周期
new,注入,aware,前置,init,后置,注册回调函数,执行,执行回调函数,销毁
MySQL
10. 隔离级别
RU,RC,RR,S
11. MySQL和Oracle的隔离级别
前者RR,后者RC
12. 如何优化数据库的性能
优化字段
创建表的范式和反范式
索引,前缀索引,hash索引,组合索引
13. 数据量太大怎么办
分库分表,每个表横向切分
14. 分表主键唯一性
通过触发器在业务层面上约束
- UUID:通过唯一识别码16个字节128位的长数字;组成部分:当前日期和时间序列+全局的唯一性网卡mac地;优点:代码实现简单、不占用宽带、数据迁移不受影响;缺点:无序、无法保证趋势递增(要求3)字符存储、传输、查询慢、不可读、可以逆向出mac地址不安全
- 雪花算法:表示符+时间戳+机器码+12位毫秒计数器;优点:自增,灵活度高;缺点:依赖机器的时钟,每个机器的时钟不可能完全同步
- 通过mysql的auto_increment的间隔
- 通过redis的步长来保证
计算机网络
15. session和cookie的区别
http是无状态的
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式
数据结构
16. 如何判断循环链表
快慢指针
17. 怎么查看环的入口
slow pointer 到入口的顺时针距离为head到入口的距离
项目
18. 说一下项目的流程
业务
19. 项目的难点
并发肯定是因为TPS上不去,所以难点肯定是TPS这一块
包括redis缓存,还有消息队列(缓存雪崩(令牌限流访问,阿里数据库有款中间件),穿透(布隆过滤器过滤黑名单)),缓存预热
令牌桶平滑流量,防止并发流量
最后一个是安全,防止脚本刷接口(限制请求次数redis的lru,验证请求头,生成动态秘钥),csrf,xss
还有一个是超买和少卖的问题
20. 为什么做这个项目
21. 两个域名如何实现登录态的共享
cookie不能跨域,这个是SSO
- client访问a.com
- a.com发现没有a_cookie,跳转到ssoServer
- ssoServer发现没有sso_cookie,使client跳转登录界面
- client登录后,ssoServer存储session,并使得client携带sso_cookie,此时把ticket发送给a.com
- a.com拿到ticket后,请求ssoServer的ticket是否正确,如果正确,则设置client的a_cookie,登录成功
- client访问b.com
- b.com发现没有b_cookie,跳转到ssoServer
- ssoServer发现有sso_cookie,即client已经登录,那么会把ticket传给b.com
- b..com拿到ticket后,请求ssoServer的ticket是否正确,如果正确,则设置client的b_cookie,登录成功
22. 如何保证Redis和MySQL的一致性
- 实时策略:删除Redis缓存,先更新MySQL,然后删除Redis的缓存(先写redis再写mysql,如果写入失败事务回滚会造成redis中存在脏数据)。第一个删除为了保证redis中没有该数据,第二个删除防止其他线程脏读
- 异步策略,更新redis,异步更新MySQL
23. 如何保证MQ的消息一致性和幂等性
consumer如何确定把消息同步到数据库中
首先通过MQ的事物保证redis和producer的一致性
producer-ack-broker-ack-consumer,通过ack来保证一直性
MQ在重发消息的时候怎么保证幂等性
可能生产者重发消息,也可能消费者重发消息。mq内部有一个记录消息消费成功的id,如果存在该id则不去消费
其他
24. 平时有什么爱好
篮球唱歌
25. 怎么刷基础理论
看面经和源码
26. 有效的Java代码有多少行
5k行
27. 实验室的矛盾怎么处理
二面
1. 秒杀系统的关键点
2. 令牌桶和漏桶
前者限制请求数目,后者限制请求速率
3. 如何反向增加库存
4. Nginx的作用
缓存,负载均衡
5. POST和GET
6. HTTP和TCP长连接的不同
TCP维持长连接是需要保活机制的
HTTP的长连接是为了复用TCP的长连接,也就是说多个HTTP请求可以复用一个TCP连接