实习面经摘录(八)

来自网络,供个人学习 某东,某音,xx

先完成后完美

1.怎么保证websocket的通信的低延迟、高可靠(心跳机制,短线重连)?什么是NIO?

java中NIO,netty框架

NIO

  • 优势:一个线程可以管理成千上万个连接(只有当连接真的有数据读写时才处理),适合高并发场景。
  • Netty:基于NIO封装的高性能网络框架,解决了原生NIO API复杂、易出错(如粘包拆包)的问题。

2.项目一般怎么定义和使用bean?resource 和autowired的区别

  • 定义/use :在类上加 @Component / @Service / @Controller,或在配置类方法上加 @Bean。使用时在字段/构造器上加注入注解。
  • 区别
    • @Autowired:Spring自带,默认按类型 装配。若类型多个,需配合 @Qualifier("name") 指定名称。
    • @Resource:JDK标准(JSR-250),默认按名称装配。找不到名称再按类型。更推荐用于消除歧义

3.spring怎么管理bean,什么是单例模式

  • 怎么管理 :Spring启动时扫描包,将标记了注解的类实例化,放入IOC容器 (ConcurrentHashMap)中管理。需要时直接从容器取,而不是 new
  • 单例模式 :Spring Bean默认是单例 (Singleton),即整个应用中该类的实例只有一个。
    • 注意:单例Bean中不要定义可变的成员变量(除非加锁或ThreadLocal),否则会有线程安全问题。

4.1w机器同时上传指令怎么办?

  • 核心思路削峰填谷 + 异步处理
  • 方案
    1. 网关层做限流。
    2. 指令先写入消息队列(Kafka/RocketMQ),抗住瞬时流量。
    3. 后端服务从MQ慢慢消费,写入数据库或执行逻辑。
    4. 若涉及状态更新,用Redis做分布式锁或计数器

4.1 怎么查看内存占用

  • 命令top (看整体), free -h (看剩余), jstat -gc <pid> (看JVM GC), jmap -heap <pid> (看堆详情)。
  • 工具 :VisualVM, Arthas (dashboard, memory)。

4.2 用过ai编程放在哪里

4.3redis bitmap实现签到,为撒用这个数据结构;java项目中怎么实现这个bitmap的

为什么用极度节省空间。存储1亿用户签到,Bitmap只需约12MB内存(1亿bit),而普通String或Hash需要几百MB。且支持位运算(如统计连续签到)

java实现

  • 设值:redisTemplate.opsForValue().setBit(key, offset, true) (offset是第几天)。
  • 取值:getBit(key, offset)
  • 统计:bitCount(key)

4.4什么是延迟队列,有用过吗

  • 是什么:消息存入后,不立即消费,而是等待指定时间后才被消费。
  • 用途:订单超时取消、支付超时关单、定时任务重试。
  • 实现
    1. RabbitMQ的TTL + 死信队列
    2. RocketMQ的定时消息(直接支持)。
    3. Redis的ZSet(分数为时间戳,轮询取出)。
    4. JDK的DelayQueue(仅限单机内存)。

5.tcp三次握手

  1. SYN:客户端发"我想连你"。
  2. SYN+ACK:服务端回"好的,我也想连你"。
  3. ACK:客户端回"收到了,连接建立"。
  • 目的:确认双方收发能力正常,防止已失效的连接请求突然传到服务端。

6.tcp拥塞控制有哪些算法

  • 慢启动 (Slow Start)
  • 拥塞避免 (Congestion Avoidance)
  • 快重传 (Fast Retransmit)
  • 快恢复 (Fast Recovery)
  • (新版还有BBR等)

7.redis缓存穿透相关有了解吗

8.mysql有哪些隔离级别

  1. 读未提交 (Read Uncommitted):有脏读。
  2. 读已提交 (Read Committed, RC):解决脏读,有不可重复读。(Oracle默认)
  3. 可重复读 (Repeatable Read, RR):解决不可重复读,大部分解决幻读。(MySQL默认
  4. 串行化 (Serializable):效率最低,最安全。

9.mysql如果出现一条慢查询,怎么排查和优化

  1. 开启慢查询日志 (slow_query_log),定位慢SQL。
  2. Explain分析 :看 type (是否走索引)、key (用了哪个索引)、rows (扫描行数)。
  3. 优化手段
    • 加索引(最左前缀原则)。
    • 改写SQL(避免 select *, 避免 like '%xx', 避免索引列计算)。
    • 大表分页优化(覆盖索引+子查询)。
    • 架构升级(读写分离、分库分表)

10.无序链表去重

  • 思路 :用HashSet辅助。
  • 步骤:遍历链表,若节点值在Set中存在,则删除该节点;若不存在,加入Set并继续。
  • 复杂度:时间O(N),空间O(N)。

11.自己写一个两个线程,完成一个aAbBcCdD...zZ完成一个交替打印

  • 思路 :共享一个标志位 flag (true表示打印小写)。
  • 机制
    • 线程A (小写):检查 flag==true ? 打印 : wait()。打印完设 flag=falsenotify()
    • 线程B (大写):检查 flag==false ? 打印 : wait()。打印完设 flag=truenotify()

场景题:

12.怎么防刷网站

  1. 前端:验证码(滑块/点选)、隐藏真实接口地址。
  2. 网关/Nginx:IP限流(单IP每秒请求数)、User-Agent黑名单。
  3. 应用层
    • Token机制:每次请求带动态Token。
    • Redis计数:单用户/单IP单位时间内访问次数超限则封禁。
    • 设备指纹:识别同一设备。
  4. WAF:接入云厂商Web应用防火墙。

13.微服务:一个服务更新怎么通知其他服务

  1. 事件驱动 (推荐):更新服务发布消息到MQ (RocketMQ/Kafka),其他服务订阅消费。解耦,最终一致性。
  2. HTTP回调:更新成功后,主动调用其他服务接口(需处理重试和幂等)。
  3. 监听Binlog:使用Canal监听数据库变更日志,发送到MQ(无侵入)。

14.收集数据从设备采集到入库,中间件的数据流向是什么样的

  • 设备 -> MQTT/TCP -> 网关 (Netty) -> 消息队列 (Kafka) (削峰) -> 流计算 (Flink) (清洗/聚合) -> 存储(TSDB/MySQL/HBase)。
  • 关键点:MQ解耦,Flink实时处理,时序库存监控数据。

15.(普罗米修斯,时序数据库) ,es与mysql同步怎么做的;es的倒排索引是什么,有用到吗

  • ES与MySQL同步
    • 双写:代码里同时写(不一致风险大,不推荐)。
    • MQ异步:写MySQL成功后发消息,消费者写ES。
    • Canal:监听MySQL Binlog自动同步到ES(最常用,保证最终一致)。
  • 倒排索引
    • 正排:文档ID -> 内容。
    • 倒排单词 -> 文档ID列表
    • 作用:搜索引擎核心,通过关键词瞬间找到包含该词的所有文档,速度极快。

16.怎么优化性能,怎么做选型

  • 优化
    1. 缓存 (Redis) 抗读。
    2. 异步 (MQ) 抗写/削峰。
    3. 索引 提速查询。
    4. 池化 (连接池/线程池) 复用资源。
    5. 扩容 (加机器/分库分表)。
  • 选型
    • 数据量 (万级MySQL,亿级HBase/ES)。
    • 读写比 (读多写少加缓存)。
    • 一致性要求 (强一致选DB,最终一致选ES/MQ)。
    • 团队熟悉度 (运维成本)。

17.什么是冷热分离,有哪些业务场景

是什么:将数据按访问频率分为热数据 (最近3个月,高频访问) 和冷数据 (历史数据,低频访问)。

场景:

订单表:近半年订单查得多,放高性能库/SSD;一年前订单归档到HDFS/廉价存储。

日志系统:近期日志查得多,老日志压缩存储。

好处:减小主表体积,提升热点查询速度,降低存储成本。

18.数据库表,字段,索引怎么设计

从需求出发,然后比如设计一个测试题的点击,如果测试题的用量在10w以下,感觉直接mysql就行;如果后面点击量大了,考虑并发的话,加入redis,然后往后考虑分库分表,冷热分离,熔断降级。

  • 流程
    1. 需求分析:确定实体、关系、读写比例、数据量预估。
    2. 概念设计:画ER图。
    3. 逻辑设计 :转成表结构,定字段类型,建索引 (根据查询条件)。
    4. 物理设计:选引擎 (InnoDB),设字符集 (utf8mb4)。
  • 演进路线 (以测试题点击为例):
    • < 10w量:单表MySQL,正常索引。
    • 并发高了 :加Redis计数器 (incr),定时异步落库。
    • 数据量大了 :按月/年分表 ,或分库
    • 历史数据 :做冷热分离,老数据归档。
    • 极端流量 :加熔断降级 (非核心统计失败则丢弃),限流。
相关推荐
拾年2751 小时前
别再让 NullPointerException 搞崩你的代码了!Optional + Stream 组合拳详解
java
weixin_404157681 小时前
Java高级面试与工程实践问题集(一)
java·开发语言·面试
cyforkk1 小时前
Spring AOP 进阶:揭秘 @annotation 参数绑定的底层逻辑
java·数据库·spring
清风徐来QCQ1 小时前
Java2(valueOf,Character,StringBuilder,设计模式)
java·开发语言
台XX1 小时前
Java容器常用方法
java·开发语言
tonyhi61 小时前
Ubuntu DeepSeek R1本地化部署 Ollama+Docker+OpenWebUI
java·ubuntu·docker
庞轩px2 小时前
面经分享1
java·笔记·面试
Yang-Never2 小时前
OpenGL ES ->YUV图像基础知识
android·java·开发语言·kotlin·android studio
Java成神之路-2 小时前
深度剖析 Java 类初始化机制:从<clinit>()/<init>() 字节码到静态内部类懒加载实战
java