shopee 后端面试题目
1、我的大数据方向
leetcode hard 寻找两个有序数组的中位数
了解MVCC吗
MVCC:多版本并发控制。
特点
1.MVCC其实广泛应用于数据库技术,像Oracle,PostgreSQL等也引入了该技术,即适用范围广
2.MVCC并没有简单的使用数据库的行锁,而是使用了行级锁,row_level_lock,而非InnoDB中的innodb_row_lock.
基本原理:MVCC的实现,通过保存数据在某个时间点的快照来实现的。这意味着一个事务无论运行多长时间,在同一个事务里能够看到数据一致的视图。根据事务开始的时间不同,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。
- Mysql两种引擎对比
InnoDB | myisam | |
---|---|---|
储存方式 | 聚集索引(B+树存储索引和数据) | 非聚集(B+树存储索引;数据表存数据) |
事务安全 | 事务安全 | 非事务安全 |
锁 | 表锁、行锁 | 表锁 |
全文索引 | 不支持(5.5之前) | 支持 |
外键 | 支持 | 不支持 |
事物处理,具有ACID(原子性,一致性,隔离性,持久性)事物支持等特性,如果在应用中大量使用insert和update操作,应选用InnoDB。 | 管理非事物表,提供高速存储和检索以及全文搜索的能力,如果在应用中执行大量的select操作,应选用MyISAM |
脏读 幻读 不可重复读
脏读:读取另一个事务未提交的数据
幻读:同样的条件,第一次和第二次读出来的记录条数不一样。(新增或删除)。
不可重复读:同样的查询条件,查询到的结果都不一样(中间有对数据进行了修改)。
bonus:
1、事务的四种隔离级别:读取未提交、读取已提交、可重复读,串行化
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读取已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
2、MySQL默认隔离级别:可重复读,因此只会出现幻读。
- 进程间通信方式,常用的哪种
进程间通信方式
信号量、共享内存、无名管道、命名管道(FIFO)、消息队列、套接字、全双工管道
后两者适用于远程通信,适合网络编程。
bonus:
1、全双工管道:数据通讯是双向的,int pipe(int fd[]); fd[0]/fd[1]分别对应:读、写;
三次握手:
- 第一次:客户端发送初始序号x和syn=1请求标志
- 第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1
- 第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1
三次握手
四次挥手过程分析
第一次:客户端请求断开FIN,seq=u
第二次:服务器确认客户端的断开请求ACK,ack=u+1,seq=v
第三次:服务器请求断开FIN,seq=w,ACK,ack=u+1
第四次:客户端确认服务器的断开ACK,ack=w+1,seq=u+1
为什么要三次握手四次挥手,两次握手三次挥手不行吗?
三次握手原因:考虑到因为网络导致的报文失效情况。客户端发出请求,因网络原因延迟很久,客户端认为这条失效,而服务端在某个时刻受到,它将回应,但是客户端不会理会这个回应(失效),于是服务端就等着客户端发请求,就会白白浪费服务端资源;
四次挥手原因:为了保证数据完整传输。服务端的数据可能还没有全部被客户端受到。
Http状态码,1.2.3.4.5开头的啥意思
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常用的:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
- 502 - 网关错误 Bad Gateway
- 504 - 响应超时 Gateway Time-out
Hashmap底层原理
解决哈希冲突的方法
链式分离法、开放地址法,双哈希法、溢出表
数组和链表的区别
kafka原理讲一下
kafka的topic与partition关系
Kafka消息是否有序
Hdfs数据存储过程是怎样的
Hadoop的map reduce过程是怎样的
Spark有哪几种算子
Spark的shuffle过程是怎样的
如何解决spark的数据倾斜
Spark 如何优化两个大小表的jion操作
大数据中寻找top-K的方法 (小顶堆),算法复杂度?(nlogK)
二面:
算法,寻找奇点
LeetCode 162
反射了解吗?使用场景?
反射是指运行中的java程序能动态获取类的方法、属性、构造函数。
反射的流程:
1、获取指定名称的Class对象,方法有:Class.forName()、obj.getClass()、类名.class()
2、实例化对象,获取类的方法、属性和构造函数;
3、访问属性、方法、调用构造函数创建对象。
应用场景:
1、反编译:.class --> .java
2、Spring IoC
3、Tomcat服务器(IO、ServerSocket、反射)
反射的优缺点:
优点:运行期类型的判断,动态加载类,提高代码灵活度,提高了应用程序的***可扩展性***;
缺点:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多(性能问题)。
序列化及其使用场景
序列化:将对象写入到IO流中
private static void serialize(String filename) throws IOException {
File f = new File(filename); // 定义保存路径
OutputStream out = new FileOutputStream(f); // 文件输出流
ObjectOutputStream oos = new ObjectOutputStream(out); // 对象输出流
oos.writeObject(new Person("Jack", 30, Sex.MALE)); // 保存对象
oos.close();
out.close