面经总结1

知识

1. cookie和session

  • 因为HTTP协议是无状态的,需要追踪用户的会话,所以就用了cookie和session。不同的是,cookie在客户端,session在服务端。
  • cookie的就是相当于一个身份证,服务端通过response给客户端发一个cookie,客户端每次访问的时候就向服务端提交这个cookie,可以通过javascript:alert(document.cookie)来查看cookie。特征:cookie具有不可跨域名性。
  • session就是服务端把客户端的信息记录在服务期上,每次客户来访问就会查找客户的明细。
  • cookie就是检查cookie的信息来判断客户的身份,session通过检查服务器的客户明细来确定用户的信息。cookie的有效期比较长,但是不安全,session的有效期比较短,但是比session安全。

2. TCP/IP三次握手,四次挥手,TIME_WAIT

  • 三次握手 :1.客户端向服务端发送SYN=1,seq=x的包,客户端进入SYN_SENT状态。2.服务端向客户端发送ack=x+1,SYN=1,ACK=1,seq=y的包,SYN_RECV状态,3.客户端向服务端发送ACK=1,ack=y+1,seq=x+1的包,客户端和服务端进行ESTBLISHED状态
  • 四次挥手:1.客户端向服务端发送FIN=1,seq=x的包,进入FIN_WAIT1状态,2.服务端向客户端发送ACK=1,ack=x+1,seq=v的包,服务端进入close_wait状态,客户端收到这个包之后,进入FIN_WAIT2状态。3.等一段时间后,服务端没有数据要发了,就向客户端发送FIN=1,ACK=1,seq=w,ack=x+1的包,服务端进入LAST_ACK状态。4.客户端向服务端发送seq=u+1,ack=w+1,ACK=1的包,客户端进入TIME_WAIT状态,服务端接受了之后进入CLOSE状态,客户端等两个最大报文端存活时间后进入CLOSED状态。
  • 问题1:为什么不能是两次握手:如果说客户端给服务端发送了一个请求连接的报文,但是这个因为网络延迟,直到释放连接之后才到达服务端,服务端就会给客户端会一个确认连接的报文,如果是两次握手的话,这时候就确认连接了,但是因为客户端这时候没有想要连接,所以就不理睬服务端,就浪费了资源。如果三次握手握手的话,服务端发过去确认连接的报文后,客户端不回复,服务端就知道客户端没有相建立连接,就不等着了。
  • 问题2:为什么有TIME-WAIT状态,TIME_WAIT状态是在最后一次挥手的时候,客户端会持续两个报文最大存活时间,如果客户端最后一次发的报文没有到达服务端,服务端就会一直发送请求断开的报文。如果客户端直接断开了,没有TIME_WAIT状态,服务端就一直发,并且客户端收不到,直到超时。如果是有TIME_WAIT状态,客户端一收到服务端的请求断开,就会给服务端发送确认断开的包,这样服务端就不会一直发了。
  • 问题3:为什么两次挥手,而不是四次挥手:前两次挥手是客户端告诉服务端自己不再发送信息了,关闭服务端的接收,进入半关闭状态,后两次是服务端不再发送信息了,完全关闭。如果只有两次挥手的话,可能服务端还有发完信息,四次挥手是保证服务端能把信息发完。
  • 注:ACK确认序号,表示响应。SYN同步序号,表示请求链接。seq序列号。ack确认号,表示已经收到一个了,和期待下一个。
  1. 数据库ACID
  2. 数据库隔离级别,怎么避免幻读

3. 平衡二叉树、B树、B+树、B*树

参考博文

  • 1.平衡二叉树:二叉树、左孩子<根节点<右孩子、左右子树的高度差小于1、没有重复值
  • 2.B树(B-树)
    • 特性:B树的分支因子比较大,可以在时间logn的内快速的插入和删除节点,当B树有N个关键字,m阶时,其最大高度是** l o g m / 2 ( N + 1 ) / 2 + 1 log_{m/2}^{(N+1)/2}+1 logm/2(N+1)/2+1**
    • 特点:
      • 1.左小右大;
      • 2.非叶子节点的子结点树>1,且<=M,并且M>=2,空树除外,M是M个搜索路径
      • 3.枝节点的关键字数量大于ceil(M/2)-1个,且小于M-1个
      • 4.所有叶子节点均在同一层,叶子节点除了包含了关键字和关键字记录的指针,也有指向其子结点的指针,不过是这项null,对应下一层
  • 3.B+树
    - B树的异同点:1.n棵子树对一个n-1个关键字; 2.所有的叶子节点包含了全部关键字的信息;3.所有非终端节点可以索引部分。
    - 为什么用B+树作为索引:1.B+树磁盘读写代价更低,因为他的内部节点没有指向关键字具体信息的指针;2.B+树查询效率更稳定,因为他的非终节点不是指向文件内容的节点,所有的查询都有从根节点走向叶子节点,这样每次查询的效率都相当。
  • 4.B*树
    - 特点:空间使用率高,要求块的使用率为2/3;增加了指向兄弟节点的指针,
    - B+树的分裂:当一个节点满时,分出1/2到一个新的节点,父节点在增加一个指向这个节点的指针。
    - B树的分裂:当一个节点满时,如果下一个兄弟节点没有满,将一部分数据移到兄弟节点中,再在原节点中插入关键字,最后修改父节点的关键字;如果下一个兄弟节点满了,就在中间创建一个新的节点,原节点和兄弟节点各迁出1/3到新节点,最后在父节点中创建指向新节点的指针。
    注:B
    树创建新节点的概率比B+树创建新节点的概率要低,空间使用率要高。
    注:平衡二叉树要尽量避免成为链表,一般用红黑树实现

4. 哈希表的数据结构,怎么解决哈希冲突,为什么链表太长了要用红黑树,为什么不直接用红黑树

哈希冲突:算出来的哈希值的地址被占了
解决哈希冲突的办法:开放定址法、再哈希法、链地址法、建立公共溢出区

  • 开放定址法:如果地址被占了,就一哈希值为哈希函数的输入,在得到一个哈希值,知道可存放的地址没被占。
  • 再哈希法:构造多个哈希函数,一个被占了用另一个算。
  • 链地址法:哈希值相同的构成一个链表,如果链表超过8个左右,需要用到红黑树,因为一般都超不过8个,如果超过的太多的话可能是哈希函数不合适。
  • 建立公共溢出区:把和表冲突的函数,一律放到溢出区。

5. 进程和线程的区别,进程间通信

  • 1.进程和线程的区别:
    • 进程是操作系统资源分配的基本单位,线程是处理器调度和执行的基本单位。进程其实就是一个程序,线程就是这个进程的执行单位。协程我理解的就是函数吧。
  • 2.线程间通信的方式:
    • 无名管道:速度慢、容量有限,并且只能在有关系的进程间通信。
    • 命名管道:命名管道可以在任何进程间通信,但是速度满。
    • 消息队列:消息队列就是一个链接表,一个消息由一个标识符来标识。
    • 信号量:不能传递复杂消息,只能用于同步。
    • 共享内存:速度快,但是要保持同步,比如一个写的时候,另一个要注意读写的问题,相当于线程间的线程安全。

6. linux查看进程,查看端口命令,杀死命令进程,杀死进程原理是什么,是如何和系统调用通信的

  1. 查看进程 ps -a
  2. 杀死进程 kill 598
  3. kill的原理:向内核发送一个系统操作信号和程序的进程标识号。和系统通信的方式:信号量。

7. 数据库事务ACID

  • ACID: 原子性、一致性、隔离性、持久性
  • 事务四个隔离级别:读未提交、读提交、可重复读、串行化
  • MySQL lnnoDB默认隔离级别:可重复读
  • 如何避免幻读,用哪种锁:串行化或者加Next-Key
  • 联合索引失效的条件
    联合索引,又称为复合索引,两个列或更多列被称为复合索引。从左到右,断点之后联合索引失效,断点:没用或者是个范围。
  • 索引失效的条件
    • 不在索引上做任何操作(计算、函数、类型转换)
    • 使用is null、is not null
    • 使用不等于、大于、小于
    • like以通配符开头
  • 给了几条SQL语句,问会不会用到索引(最左前缀原则和索引失效的一些情况)
  1. MVCC多版本并发控制

  2. sql 课程成绩表 grade 字段 class sid score找出每门课的最高分的学生.

  3. JVM内存分布

  4. 跨域问题

  5. Redis的数据结构以及应用场景

  6. Mysql如何实现主从
    主从1
    主从2

  7. 负载均衡策略

  8. 设计一个评论系统,支持以页ID(page_id)为维度进行评论

  9. 要求增、删、改、按页面查列表、按用户查询给出接口列表出入参、表结构

  10. hashtable实现的方法

  11. redius有哪些数据结构

  12. setnx可以实现分布式锁

  13. 聚簇索引和非聚簇索引有什么区别?InnoDB属于哪种?

26. HTTP状态码500-505的含义?

  • 500:服务器内部错误,可能是用户权限或者数据库连接错误
  • 501:服务器还不具备请求功能
  • 502:服务器上的一个错误网关
  • 503:服务其正在维护或者暂停了,或者是CPU占用的频率太高
  • 504:网关超时
  • 505:http的版本不受支持
  1. Nginx的特点
  2. 你做过什么MySQL调优?

30. 怎么看SQL的执行计划(explain)

explain可以看sql语句的执行计划,比如说有没有用到索引,有没有做全表扫描。
参考:MySQL Explain详解
32. Redis持久化机制介绍一下

33. 消息队列

  • 应用场景:解耦、异步、流量削峰
  • 本质:异步处理,来一个消息不是立即处理,而是放在一个中间件里面,等着别的程序消费。
  • 主要有:RabbitMQ、ActiveMQ、RocketMQ
  • 为什么选择RabbitMQ?还了解其他消息队列吗?比较一下RabbitMQ和它们之间的区别?
  1. linux命令
  • 在一个目录下查找一个文件用什么命令(find
  • 查看正在系统正在监听中的端口用什么命令(netstat、grep)
  • 一个日志文件,第二列是用户的访问IP,列与列之间用空格隔开,问统计出现最多的IP地址用哪些命令的组合?(cat读文件,sort+uniq用于排序,cut或awk用于获取第二列的文本,head用于获取排序后的第一行)
  1. 多路复用 select poll epoll的区别?
  2. Netty的原理?(NIO)
  3. NIO的原理?(Java的实现方式是Windows:select、Linux系:epoll、MacOS:kqueue)
  4. Netty中有多线程吗?(workerGroup,bossGroup)
  5. epoll的原理?
  6. 熟悉操作系统,能相关介绍你了解的操作系统知识吗

算法

  1. 判断链表中有没有环
  2. 在数组中找第K大的数据
  3. 给你几种面值的硬币,兑换制定的金额,用最少的硬币
  4. 根据前序遍历和中序遍历,构建二叉树
  5. 三进制转十进制(负数怎么办)
  6. 最小栈
  7. 手撕 括号匹配 中括号大括号 小括号
  8. 随机返回数组下标,概率和返回下标所存储的数字成正比
  9. leetcode440-字典序的第K小数字(困难题,据说是字节的常考算法题)
  10. leetcode53-最大子序和
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值