简单的活着

字节跳动

Posted on By Mista Cai

字节跳动

凉凉

TCP怎么保证可靠传输

数据库存储结构

Mysql最重要的两个存储引擎是: MyISAM和inodb

可不可以修改另一进程的变量

共享内存的两个进程变量地址是一样的吗

1.redis

Redis 为什么快? Redis 有哪些数据结构,zset 底层结构?为什么要有跳跃表和字典两个? 你是怎么解决超卖少卖的?如果我不在缓存中做,非要用数据库来控制超卖少卖呢?

2.计算机网络

计算机网络的三次握手,四次挥手,TIMEWAIT 状态?如何尽量处理 TIMEWAIT 过多?

CLient Server
SYN_SENT SYN_RCVD
ESTABLISHED ESTABLISHED
write() read()
FIN_WAIT_1 CLOSE_WAIT
FIN_WAIT_2 LAST_ACK
TIME_WAIT  
  • 为什么客户端最后还要等待2MSL,TIMEWAIT状态?

    MSL(Maximum Segment Lifetime),最长报文段寿命。

    第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

    第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

  • 如何尽量处理 TIMEWAIT 过多?

    服务器处于TIMEWAIT状态端口过多,多出现在高并发短连接场景下。

    sysctl改两个内核参数就行了,如下:

    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    

    简单来说,就是打开系统的TIMEWAIT重用和快速回收,至于怎么重用和快速回收,这个问题我没有深究,实际场景中这么做确实有效果。用netstat或者ss观察就能得出结论。

    还有些朋友同时也会打开syncookies这个功能,如下:

    net.ipv4.tcp_syncookies = 1
    

    打开这个syncookies的目的实际上是:“在服务器资源(并非单指端口资源,拒绝服务有很多种资源不足的情况)不足的情况下,尽量不要拒绝TCP的syn(连接)请求,尽量把syn请求缓存起来,留着过会儿有能力的时候处理这些TCP的连接请求”。

  • TCP 的三次握手改成两次握手可以吗?

    Server 的 ACK 确认包和接下来的 SYN 包合成一个SYN ACK包一起发送的,没必要分别单独发送,这样子三次握手在进行最少次交互的情况下完成了两端的资源分配和初始化序列号的交换。

  • TCP 四次挥手能不能变成三次挥手呢?

    可能的。

    TCP是全双工通信,如果Server在收到Client的FIN包后,在也没数据需要发送给Client了,那么对Client的ACK包和Server自己的FIN包就可以合并成为一个包发送过去,这样四次挥手就可以变成三次了(似乎linux协议栈就是这样实现的)。

3.手撕代码

  • 写道算法题,数组的逆序数。要求能运行!

    一个排列中逆序的总数就称为这个排列的逆序数

    比如数组【1,2,3,4,5,6】,顺序与数字大小相一致,整体上是一个升序排列,那它的逆序数就是0,不存在逆序;如果调换了里面的数字,比如2和5,原来的数组就变为【1,5,3,4,2,6】,由于5>3,5>4,同时5>2,那5的位置引发的逆序数就是3(右侧有三个数字小于本身),数字3的逆序数为1,数字4 的逆序数是1,那么这个一维排布的数组的逆序数就是5。

    双重循环、归并排序。

写个 LRU。

写个最长回文序列:回文子序列,因为是不连续的肯定是不能直接枚举,那么利用动态规划。我们知道对于任意字符串,如果头尾字符相同,那么字符串的最长子序列等于去掉首尾的字符串的最长子序列加上首尾;如果首尾字符不同,则最长子序列等于去掉头的字符串的最长子序列和去掉尾的字符串的最长子序列的较大者,由此得到转移方程。

4.限流的算法?为什么用令牌桶?令牌桶的限流有什么缺点?

5.了解分布式消息吗?

6. Kafka怎么保证信息有序?

1. 先写个题,

矩阵中的最长递增路径,给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 利用记忆化搜索搞定。

2.又问了一下字节夏令营的项目。

3.让你系统的设计一个高并发的架构,你会从哪几个方面考虑?

4. 再写一个判断一个二叉树是另一个二叉树的子树? 剑指offer原题

5.情景设计:

一个千万级的APP,你要搞定关注和粉丝列表,你用什么来做。要求最后一个关注的在最前面。新增和取关都要比较快的反馈你怎么做? 如果一个人关注了之后,服务器宕机了怎么办?

6.了解RPC吗?说了一点点

1

手写算法: 死锁,以O(1)时间复杂度取得最小值的栈,要求有pop push getMin方法

2

tcp三次握手加一次变成四次握手有什么问题?

3

浏览器输入网址之后发生了什么?

4

mylsam,innodb的区别,

5

数据库行锁表锁,什么时候会加锁?

6

查询语句是否用到索引的分析。

7

rocketmq消息队列原理,单机性能多少? 为什么这么快? rocketmq如何支持事务的?

8

实习项目的问题,为什么要用当前的模型?有没有更好的模型可以选择?为什么不用更好的?

二面:

1

手写算法: 1.给一个字符串数组,统计每一个字符串出现的次数,要求不能用set,map.时间复杂度O(n). 2.实现一个阻塞队列,考虑到多线程并发的情况,要求有put,get,isEmpty, isFull方法。

2

hashMap底层实现,链表过长会做什么操作?红黑树高度过高会做什么操作? synchronized 和 reentrantlock区别和底层实现。

3

浏览器输入网址之后发生了什么?

4

cookie,session相关的知识。

5

一致性哈希原理,负载均衡算法。

6

正向代理,反向代理。

7

redis为什么这么快? 高并发如何处理的?

三面:

1

手写算法: 反转二叉树

2

场景题: 1 索引设计:一个表有三个字段A,B,C 常用查询语句有 select .. from table where B=..and C= .. select .. from table where A=..and B= .. select .. from table where B=.. 说明如何建立索引以及原因

3

设计一个短链接服务,短信中的短网址点开之后变成完整的url,完整的url转成短网址发送到用户短信中。整体流程设计。

4

给两个文件a,b a大小为3t, b大小为2t,a中存储的是id 和 name ,b中存储的是id和title,计算机内存2g,要求用最快的方法找出a和b的id重合的部分,输出文件c,c中存储的是id,name,title。 注 id是 varchar 32.