目录
知识
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确认号,表示已经收到一个了,和期待下一个。
- 数据库ACID
- 数据库隔离级别,怎么避免幻读
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查看进程,查看端口命令,杀死命令进程,杀死进程原理是什么,是如何和系统调用通信的
- 查看进程 ps -a
- 杀死进程 kill 598
- kill的原理:向内核发送一个系统操作信号和程序的进程标识号。和系统通信的方式:信号量。
7. 数据库事务ACID
- ACID: 原子性、一致性、隔离性、持久性
- 事务四个隔离级别:读未提交、读提交、可重复读、串行化
- MySQL lnnoDB默认隔离级别:可重复读
- 如何避免幻读,用哪种锁:串行化或者加Next-Key
- 联合索引失效的条件
联合索引,又称为复合索引,两个列或更多列被称为复合索引。从左到右,断点之后联合索引失效,断点:没用或者是个范围。 - 索引失效的条件
- 不在索引上做任何操作(计算、函数、类型转换)
- 使用is null、is not null
- 使用不等于、大于、小于
- like以通配符开头
- 给了几条SQL语句,问会不会用到索引(最左前缀原则和索引失效的一些情况)
-
MVCC多版本并发控制
-
sql 课程成绩表 grade 字段 class sid score找出每门课的最高分的学生.
-
JVM内存分布
-
跨域问题
-
Redis的数据结构以及应用场景
-
负载均衡策略
-
设计一个评论系统,支持以页ID(page_id)为维度进行评论
-
要求增、删、改、按页面查列表、按用户查询给出接口列表出入参、表结构
-
hashtable实现的方法
-
redius有哪些数据结构
-
setnx可以实现分布式锁
-
聚簇索引和非聚簇索引有什么区别?InnoDB属于哪种?
26. HTTP状态码500-505的含义?
- 500:服务器内部错误,可能是用户权限或者数据库连接错误
- 501:服务器还不具备请求功能
- 502:服务器上的一个错误网关
- 503:服务其正在维护或者暂停了,或者是CPU占用的频率太高
- 504:网关超时
- 505:http的版本不受支持
- Nginx的特点
- 你做过什么MySQL调优?
30. 怎么看SQL的执行计划(explain)
explain可以看sql语句的执行计划,比如说有没有用到索引,有没有做全表扫描。
参考:MySQL Explain详解
32. Redis持久化机制介绍一下
33. 消息队列
- 应用场景:解耦、异步、流量削峰
- 本质:异步处理,来一个消息不是立即处理,而是放在一个中间件里面,等着别的程序消费。
- 主要有:RabbitMQ、ActiveMQ、RocketMQ
- 为什么选择RabbitMQ?还了解其他消息队列吗?比较一下RabbitMQ和它们之间的区别?
- linux命令
- 在一个目录下查找一个文件用什么命令(find
- 查看正在系统正在监听中的端口用什么命令(netstat、grep)
- 一个日志文件,第二列是用户的访问IP,列与列之间用空格隔开,问统计出现最多的IP地址用哪些命令的组合?(cat读文件,sort+uniq用于排序,cut或awk用于获取第二列的文本,head用于获取排序后的第一行)
- 多路复用 select poll epoll的区别?
- Netty的原理?(NIO)
- NIO的原理?(Java的实现方式是Windows:select、Linux系:epoll、MacOS:kqueue)
- Netty中有多线程吗?(workerGroup,bossGroup)
- epoll的原理?
- 熟悉操作系统,能相关介绍你了解的操作系统知识吗
算法
- 判断链表中有没有环
- 在数组中找第K大的数据
- 给你几种面值的硬币,兑换制定的金额,用最少的硬币
- 根据前序遍历和中序遍历,构建二叉树
- 三进制转十进制(负数怎么办)
- 最小栈
- 手撕 括号匹配 中括号大括号 小括号
- 随机返回数组下标,概率和返回下标所存储的数字成正比
- leetcode440-字典序的第K小数字(困难题,据说是字节的常考算法题)
- leetcode53-最大子序和