面试复盘-25-02-17

简述

25年第一次面试,电话面试,这次面试没有准备好,还没来得及复习。

自我介绍

19年毕业,5年多工作经验,目前正在优美互动这边工作。

定位:高开,之前带领三四个人,目前因为团队规模,各自一摊。

目前团队业务是做一些小应用投放海外市场,赚取一些收益。进入团队快一年的时间,参与了文生图和人名查询等项目。

之前华为团队也工作了三年左右的时间,业务是以洞察、评估、规划和收益四个部分向运营商提供数字化机会点发现。自己也参与了全球数据沙盘项目,到路网算法开始参与项目,然后开始OTN to 楼宇参与业务拓展,到最后的模型收编和原子能力编排重构项目。

业务爱好:打篮球,跑步,看看书,有时间也会写写博客。

项目经验

知识库

文生图

原子能力

redis

什么情况下redis的查询会很慢

两种情况,传输的时候很慢,redis处理的时候很慢

1、传输的时候很慢:网速不好,网络服务器部署太远。

2、redis处理很慢:

​ 1、存在bigkey,hotkey,占用了带宽和处理速度

​ 2、存在复杂查询,复杂度在O(n)

redis中的大key怎么删除

1、分隔:将一个bigkey分隔成多个小key,例如将一个含有上万字段的hash按照一定的策略拆分成多个hash

2、手动清理:redis4.0+可以使用 UNLINK 命令来异步删除一个或者多个指定的key,redis4.0以下可以考虑使用SCAN命令结合DEL命令来份批次删除。

3、采用合适的数据结构:例如二进制数据不使用String保存,使用HyperLogLog统计页面UV

4、开启lazy-free(惰性删除/延迟释放):lazy-free特性式redis4.0开始引进的,指的是让redis采用异步的方式延迟释放key使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程。

数据库

怎么优化sql

万变不离其宗,所有查询的优化都是基于底层存储结构。

​ 1、innerbd是以B+树的形式保存的,根据索引和id构建了B+树,所以我们在查询的时候要注意使用索引,这样可以更快的找到数据。但是在使用的时候要注意最左匹配原则和隐式计算。

​ 2、索引B+数据的叶子结点保存的只是数据的id并不是数据的所有值,所以即使根据索引找到了数据的叶子结点,如果叶子结点的字段不够查询需要,还要根据id去找具体数据,这个过程叫做回表,但是如果叶子结点包含的字段值够我们查询需要,就不需要去查询具体数据,减少了回表这个过程。

​ 3、查看执行计划,根据执行计划优化sql。

执行计划怎么查看

image-20250309103934302

https://blog.csdn.net/tannins_/article/details/140007565

比较重要的字段:

select_type:查询类型 simple 简单语句, primary 复杂查询, union 联合查询 等等

table:对应的表

type:索引类型,all < index < range < eq_ref < const < system

possible_key:分析时可能用到的索引

key:实际使用的索引

key_len:使用到索引的长度

ref:哪些列或者常量被用于查找索引列上的值

row:估算查找到满足条件的记录所需要的读取的行数

extra:执行计划的其他信息

线程

线程池的参数

两个线程数:核心线程数和最大线程数

两个停留时间相关:停留时间值和时间单位

三个过程相关:产生的工厂方法,排队的队列,拒绝的策略

线程池参数中的排序队列的注意点

队列的选择

​ 一般分为:直接提交队列,有界任务队列,无界任务队列,优先任务队列,延迟队列。

​ SynchronousQueue:直接提交队列,此队列不存储任何元素,直接将每个插入操作必须等待一个对应的移除操作,反之依然。通常用于创建无界线程池,最大线程数实际取决于系统或JVM的限制

​ ArrayBlockingQueue:有界队列,此队列是一个基于数据结构的有界阻塞队列,新元素插入队列时,如果队列已满,则插入线程会被阻塞直到队列中有空间可用。使用有界队列,可以更好的控制资源的使用防止资源耗尽。

​ LinkedBlockingQueue:此队列按照先进先出的排序规则对元素进行排序,且队列的容量Integer.MAX_VALUE,使用无界队列时,线程池的大小将只受到corePoolSize的约束,因为任务可以在队列中无限期的执行等待,然而,这可能导致资源耗尽。

​ PriorityBlockingQueue:优先队列,此队列根据元素的优先级进行排序,优先级高的元素先被移除,对于按优先级执行任务的应用场景非常有用。

​ DelayQueue:延迟队列,此队列中的元素只有当起指定延迟时间到了才能够从队列中获取到该元素

注意控制队列的长度,避免造成内存溢出

线程池中公平锁的线程是怎么唤醒的

理解有点问题,公平锁是指一个锁,而线程池是一个池,线程池中的排序队列是可以有多种队列,但是队列的本质还是从头部获取第一个元素,所以线程池还是总是从队列中获取第一个元素,只是可能有排序方式的不一样,导致不一定是先入先出。

jvm

cpu飙升怎么排查

1、使用top命令查看系统cpu占用情况,找出占用最高的进程pid

2、使用命令查找进程内占用cpu最高的线程id:ps H -eo pid,tid,%cpu | grep 最高的进程pid

3、根绝线程id查找堆栈信息,注意要将线程id转化成16进制

4、在根据堆栈信息定位问题