20240726面经背诵

  1. 线程池参数说一下?项目中哪些地方使用到了线程池?

    • 参数:
      • 核心线程数
      • 最大线程数
      • 临时线程存活时间
      • 临时线程存活时间单位
      • 线程工厂
      • 阻塞队列
      • 拒绝策略
    • 使用到线程池:
      • 助英台同步数据分为3个部分,分别是同步员工信息,同步角色信息,同步部门信息,将这3个任务交给线程池去执行,因其互不影响,交给线程池并发可以提高同步效率,因为不需要返回值,调用的是execute方法,如果需要返回值,则需要调用submit方法
      • 外卖项目中的定时任务,刷新限量菜品数量,定义了5个任务,每个任务处理一定id范围内的限量菜品刷新。
  2. 场景提:核心线程数1,最大线程数3,队列最大数量10,投放3个任务会创建多少线程,投放13个呢?

    • 投放3个,只会创建一个核心线程,两个任务被放入阻塞队列
    • 投放13个,在投放11个任务时,核心线程在执行任务,阻塞队列已满,再添加将创建两个核心线程来执行任务,所以创建3个
  3. redis有哪些数据结构?项目中都有哪里用到了?

    • string:字符串(使用SDS)
    • List:列表(使用ZipList和LinkedList)
    • hash:键值对(dict和ZipList)
    • set:不重复的集合(dict和IntSet)
    • Zset:有序的set(ZipList,SkipList)
    • Bitmap:位图
    • HyperLoglog:统计
    • GeoSpatial:经纬度
    • 项目中用到的主要是string和hash,我们的项目中所有对象存储到redis都是序列化后的对象,避免对redis的写操作,使用的string类型,还有就是redisson提供的可重入分布式锁,底层使用的是hash,key是锁名称,field是线程唯一标识,value是重入次数
  4. 项目中有使用定时任务吗?怎么使用的?

    • 实习的项目使用到定时任务主要是助英台同步数据任务,需要在每天早上5.同步助英台增量数据到人行平台
      • 使用,通过在项目中定时任务对应的类上通过JobHandler注解标识任务名,同时该类还需实现IJobHandler接口,并重写方法execute,execute中是任务的执行逻辑,然后在xxl-job的管理平台添加一个任务,编写cron表达式,指明任务名称和执行器,执行器其实就是对应着服务,服务在启动时会自动注册到xxl-job,等任务执行时会根据这些配置去对应的服务中去触发任务
    • 自己的项目主要时利用SpringBoot中的@Schedule注解来实现每日限量菜品的刷新,在对应方法上著名@Schedule注解,并在其中编写cron表达式即可,当然,得在启动类上用@EnableScheduling 注解开启定时任务
  5. 定时任务的原理?

    • 操作系统层面:
      • 操作系统提供了定时器功能,在到达指定时间后操作系统会触发一个中断,从而执行任务
    • 定时任务的实现往往需要计算下次执行的时间,到了对应执行时间后去触发执行任务,如果是xxl-job则根据执行器注册的任务去rpc调用执行器来执行,如果是Spring的话,那么内部直接触发执行。
  6. Arrays.sort()底层用到了哪种算法?

    • 现在的话主要是用到双轴快速排序算法,是对快速排序的一种改进版本,有更好的性能
    • 之前的一些版本里用的是归并排序
  7. MySQL为什么要用b+树,而不是红黑树或者b树?

    • 不用红黑树是因为,数据库一般可能会存储大量的数据,这个数据量可能到几百万,上亿甚至上十亿,这个数据量下红黑树的高度也会很大,查询性能会变得很差
    • 不用b树是因为,b树是所有节点都存储数据,而MySQL的InnoDB是以数据页为存储单位的,每次IO对应着一个数据页,而当所有节点都存储数据时,那么一个数据页能存储的索引数量大大减少,那么查询数据时的IO次数将大大增加
  8. HashMap和TreeMap有什么区别?

    • HashMap中key的存储是无序的,而TreeMap中key的存储是有序的,利用
    • HashMap的底层是哈希表实现,具体是数组+链表/红黑树,而TreeMap的底层是红黑树实现的
    • 时间复杂度,HashMap的put,get,remove的平均时间复杂度为O(1),最差会到O(n),TreeMap的put,get,remove平均时间复杂度为O(logn),相对稳定
  9. 红黑树 vs 平衡二叉树,为什么hashMap使用红黑树而不用平衡二叉树?

    • 平衡二叉树相较于红黑树更为严格,平衡二叉树要求任意左右子树不允许高度相差1,而红黑树则保证任意左右子树高度不会为另外一方的二倍
    • 由于上述限制,红黑树的插入,删除操作中的旋转操作较少,一般在两次以内即可完成,而平衡二叉树的旋转操作更多
    • 性能方面,由于HashMap的插入删除操作较多,过多的为了维护数据结构而做的旋转可能会导致性能低下
  10. MySQL慢查询怎么排查和优化?

    • 可以在mysql的conf文件中开启慢查询日志,比如查询时间大于某个阈值就记录到日志,或者某条查询语句没有走索引也存放到日志,定位的话,可以通过响应比较慢的接口根据日志中的链路id一步一步定位到sql,或者直接在慢查询日志中查询
    • 优化,将慢sql利用explain工具进行分析,重点关注index字段是否为null,看这条语句是否走了索引,同时还要关注ref字段,代表查询级别,我们的语句最好要到const级别,至少也得是ref级别,针对这个去优化语句,尽量覆盖索引,避免索引失效就好。
    • 索引失效:
      • 违反最左前缀原则
      • 在索引字段上做操作
      • 在索引字段上做类型转换
      • 模糊查询中左百分号
  11. Spring AOP的底层实现,项目中有用到AOP吗?

    • 底层是基于动态代理来实现的,最底层其实反射来实现的,如果被代理类实现了一个接口使用java的动态代理,如果没实现接口,那么使用cglib动态代理
    • 项目中的AOP,使用AOP来进行参数校验,参数解析和日志的打印,主要是用到@Pointcut()注解和@Before注解,@Pointcut著名要AOP的方法,@Before著名的方法将在这些方法之前执行
  12. 跳表是怎么实现的?redis为什么要用跳表而不是二叉树?跳表的时间复杂度是多少?

    • 通过建立多级索引来提高查询效率,每一级是一个有序链表,第0级包含所有元素,第一级只包含一半元素,往上依次减半。查询时,从最上级依次向下检索。
    • 用跳表而不用二叉树是因为这个二叉树应该是平衡二叉树,平衡二叉树在插入删除操作时除了检索到对应位置的开销,还有维持数据结构的旋转操作,而跳表只需要检索到对应位置的开销即可,而zset要涉及大量的插入删除操作,使用平衡二叉树会带来大量额外开销
    • 插入,删除,查询的时间复杂度都是O(logn),最坏情况下是O(n)
  13. time wait状态?

    • TCP主动关闭连接的那一端,在发送最后一个ACK包后会进入time wait状态,大概是2MSL报文最大生存时间,防止对方没有收到ACK包,对方如果没收到的话会会再发一个FIN包
  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值