1、项目相关

2、线程池参数及其作用。

  • corePollSize:核心线程数。在创建了线程池后,线程中没有任何线程,等到有任务到来时才创建线程去执行任务。
  • maximumPoolSize:最大线程数。表明线程中最多能够创建的线程数量。
  • keepAliveTime:空闲的线程保留的时间。
  • TimeUnit:空闲线程的保留时间单位。
  • BlockingQueue:阻塞队列,存储等待执行的任务。参数有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue可选。
  • ThreadFactory:线程工厂,用来创建线程
  • RejectedExecutionHandler:队列已满,而且任务量大于最大线程的异常处理策略。
  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
  • ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

3、Redis的持久化方式

  • 两种持久化方式
  • RDB持久化:将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化
  • AOF(append only file)持久化:将Reids的操作日志以追加的方式写入文件
  • 二者的区别
  • RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

来自oppo社招Java一面_java

  • AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

来自oppo社招Java一面_持久化_02

4、过期键的删除策略。

  • 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
  • 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
  • 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多个过期键,以及要检查多少个数据库,则由算法决定。

5、rocketmq用在什么场景。

  异步处理,应用解耦,流量削锋和消息通讯四个场景

  • 异步处理

 场景说明:用户注册后需要发送注册邮件和短信。

串行方式

 先保存用户注册信息, 然后发送注册邮件, 再发送注册短信。

并行方式

 保存用户信息后, 同时发送注册邮件和短信。

  • 应用解耦

 场景说明: 用户下单后系统减库存,传统模式是订单系统调用库存接口,订单系    统与库存系统耦合,引入消息队列方案后,用户下单后,保存订单,将消息

   写入消息队列,返回结果,库存系统订阅下单消息进行操作。

  • 流量削峰

 场景说明:秒杀活动中, 一般会因为流量过大导致应用挂掉, 加入消息队列可

   以缓解压力首先将用户请求写入消息队列,队列长度超过最大数据就丢弃

   掉请求,系统根据队列的请求消息再做后续处理。

6、四次挥手。

  • 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  • 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  • 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
  • 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  • 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。