-
线程池参数说一下?项目中哪些地方使用到了线程池?
- 参数:
- 核心线程数
- 最大线程数
- 临时线程存活时间
- 临时线程存活时间单位
- 线程工厂
- 阻塞队列
- 拒绝策略
- 使用到线程池:
- 助英台同步数据分为3个部分,分别是同步员工信息,同步角色信息,同步部门信息,将这3个任务交给线程池去执行,因其互不影响,交给线程池并发可以提高同步效率,因为不需要返回值,调用的是execute方法,如果需要返回值,则需要调用submit方法
- 外卖项目中的定时任务,刷新限量菜品数量,定义了5个任务,每个任务处理一定id范围内的限量菜品刷新。
- 参数:
-
场景提:核心线程数1,最大线程数3,队列最大数量10,投放3个任务会创建多少线程,投放13个呢?
- 投放3个,只会创建一个核心线程,两个任务被放入阻塞队列
- 投放13个,在投放11个任务时,核心线程在执行任务,阻塞队列已满,再添加将创建两个核心线程来执行任务,所以创建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是重入次数
-
项目中有使用定时任务吗?怎么使用的?
- 实习的项目使用到定时任务主要是助英台同步数据任务,需要在每天早上5.同步助英台增量数据到人行平台
- 使用,通过在项目中定时任务对应的类上通过JobHandler注解标识任务名,同时该类还需实现IJobHandler接口,并重写方法execute,execute中是任务的执行逻辑,然后在xxl-job的管理平台添加一个任务,编写cron表达式,指明任务名称和执行器,执行器其实就是对应着服务,服务在启动时会自动注册到xxl-job,等任务执行时会根据这些配置去对应的服务中去触发任务
- 自己的项目主要时利用SpringBoot中的@Schedule注解来实现每日限量菜品的刷新,在对应方法上著名@Schedule注解,并在其中编写cron表达式即可,当然,得在启动类上用@EnableScheduling 注解开启定时任务
- 实习的项目使用到定时任务主要是助英台同步数据任务,需要在每天早上5.同步助英台增量数据到人行平台
-
定时任务的原理?
- 操作系统层面:
- 操作系统提供了定时器功能,在到达指定时间后操作系统会触发一个中断,从而执行任务
- 定时任务的实现往往需要计算下次执行的时间,到了对应执行时间后去触发执行任务,如果是xxl-job则根据执行器注册的任务去rpc调用执行器来执行,如果是Spring的话,那么内部直接触发执行。
- 操作系统层面:
-
Arrays.sort()底层用到了哪种算法?
- 现在的话主要是用到双轴快速排序算法,是对快速排序的一种改进版本,有更好的性能
- 之前的一些版本里用的是归并排序
-
MySQL为什么要用b+树,而不是红黑树或者b树?
- 不用红黑树是因为,数据库一般可能会存储大量的数据,这个数据量可能到几百万,上亿甚至上十亿,这个数据量下红黑树的高度也会很大,查询性能会变得很差
- 不用b树是因为,b树是所有节点都存储数据,而MySQL的InnoDB是以数据页为存储单位的,每次IO对应着一个数据页,而当所有节点都存储数据时,那么一个数据页能存储的索引数量大大减少,那么查询数据时的IO次数将大大增加
-
HashMap和TreeMap有什么区别?
- HashMap中key的存储是无序的,而TreeMap中key的存储是有序的,利用
- HashMap的底层是哈希表实现,具体是数组+链表/红黑树,而TreeMap的底层是红黑树实现的
- 时间复杂度,HashMap的put,get,remove的平均时间复杂度为O(1),最差会到O(n),TreeMap的put,get,remove平均时间复杂度为O(logn),相对稳定
-
红黑树 vs 平衡二叉树,为什么hashMap使用红黑树而不用平衡二叉树?
- 平衡二叉树相较于红黑树更为严格,平衡二叉树要求任意左右子树不允许高度相差1,而红黑树则保证任意左右子树高度不会为另外一方的二倍
- 由于上述限制,红黑树的插入,删除操作中的旋转操作较少,一般在两次以内即可完成,而平衡二叉树的旋转操作更多
- 性能方面,由于HashMap的插入删除操作较多,过多的为了维护数据结构而做的旋转可能会导致性能低下
-
MySQL慢查询怎么排查和优化?
- 可以在mysql的conf文件中开启慢查询日志,比如查询时间大于某个阈值就记录到日志,或者某条查询语句没有走索引也存放到日志,定位的话,可以通过响应比较慢的接口根据日志中的链路id一步一步定位到sql,或者直接在慢查询日志中查询
- 优化,将慢sql利用explain工具进行分析,重点关注index字段是否为null,看这条语句是否走了索引,同时还要关注ref字段,代表查询级别,我们的语句最好要到const级别,至少也得是ref级别,针对这个去优化语句,尽量覆盖索引,避免索引失效就好。
- 索引失效:
- 违反最左前缀原则
- 在索引字段上做操作
- 在索引字段上做类型转换
- 模糊查询中左百分号
-
Spring AOP的底层实现,项目中有用到AOP吗?
- 底层是基于动态代理来实现的,最底层其实反射来实现的,如果被代理类实现了一个接口使用java的动态代理,如果没实现接口,那么使用cglib动态代理
- 项目中的AOP,使用AOP来进行参数校验,参数解析和日志的打印,主要是用到@Pointcut()注解和@Before注解,@Pointcut著名要AOP的方法,@Before著名的方法将在这些方法之前执行
-
跳表是怎么实现的?redis为什么要用跳表而不是二叉树?跳表的时间复杂度是多少?
- 通过建立多级索引来提高查询效率,每一级是一个有序链表,第0级包含所有元素,第一级只包含一半元素,往上依次减半。查询时,从最上级依次向下检索。
- 用跳表而不用二叉树是因为这个二叉树应该是平衡二叉树,平衡二叉树在插入删除操作时除了检索到对应位置的开销,还有维持数据结构的旋转操作,而跳表只需要检索到对应位置的开销即可,而zset要涉及大量的插入删除操作,使用平衡二叉树会带来大量额外开销
- 插入,删除,查询的时间复杂度都是O(logn),最坏情况下是O(n)
-
time wait状态?
- TCP主动关闭连接的那一端,在发送最后一个ACK包后会进入time wait状态,大概是2MSL报文最大生存时间,防止对方没有收到ACK包,对方如果没收到的话会会再发一个FIN包
20240726面经背诵
最新推荐文章于 2024-08-14 23:12:09 发布