来自网络,供个人学习 某东,某音,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机器同时上传指令怎么办?
- 核心思路 :削峰填谷 + 异步处理。
- 方案 :
- 网关层做限流。
- 指令先写入消息队列(Kafka/RocketMQ),抗住瞬时流量。
- 后端服务从MQ慢慢消费,写入数据库或执行逻辑。
- 若涉及状态更新,用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什么是延迟队列,有用过吗
- 是什么:消息存入后,不立即消费,而是等待指定时间后才被消费。
- 用途:订单超时取消、支付超时关单、定时任务重试。
- 实现 :
- RabbitMQ的TTL + 死信队列。
- RocketMQ的定时消息(直接支持)。
- Redis的ZSet(分数为时间戳,轮询取出)。
- JDK的
DelayQueue(仅限单机内存)。
5.tcp三次握手
- SYN:客户端发"我想连你"。
- SYN+ACK:服务端回"好的,我也想连你"。
- ACK:客户端回"收到了,连接建立"。
- 目的:确认双方收发能力正常,防止已失效的连接请求突然传到服务端。
6.tcp拥塞控制有哪些算法
- 慢启动 (Slow Start)
- 拥塞避免 (Congestion Avoidance)
- 快重传 (Fast Retransmit)
- 快恢复 (Fast Recovery)
- (新版还有BBR等)
7.redis缓存穿透相关有了解吗
8.mysql有哪些隔离级别
- 读未提交 (Read Uncommitted):有脏读。
- 读已提交 (Read Committed, RC):解决脏读,有不可重复读。(Oracle默认)
- 可重复读 (Repeatable Read, RR):解决不可重复读,大部分解决幻读。(MySQL默认)
- 串行化 (Serializable):效率最低,最安全。
9.mysql如果出现一条慢查询,怎么排查和优化
- 开启慢查询日志 (
slow_query_log),定位慢SQL。 - Explain分析 :看
type(是否走索引)、key(用了哪个索引)、rows(扫描行数)。 - 优化手段 :
- 加索引(最左前缀原则)。
- 改写SQL(避免
select *, 避免like '%xx', 避免索引列计算)。 - 大表分页优化(覆盖索引+子查询)。
- 架构升级(读写分离、分库分表)
10.无序链表去重
- 思路 :用HashSet辅助。
- 步骤:遍历链表,若节点值在Set中存在,则删除该节点;若不存在,加入Set并继续。
- 复杂度:时间O(N),空间O(N)。
11.自己写一个两个线程,完成一个aAbBcCdD...zZ完成一个交替打印
- 思路 :共享一个标志位
flag(true表示打印小写)。 - 机制 :
- 线程A (小写):检查
flag==true? 打印 :wait()。打印完设flag=false,notify()。 - 线程B (大写):检查
flag==false? 打印 :wait()。打印完设flag=true,notify()。
- 线程A (小写):检查
场景题:
12.怎么防刷网站
- 前端:验证码(滑块/点选)、隐藏真实接口地址。
- 网关/Nginx:IP限流(单IP每秒请求数)、User-Agent黑名单。
- 应用层 :
- Token机制:每次请求带动态Token。
- Redis计数:单用户/单IP单位时间内访问次数超限则封禁。
- 设备指纹:识别同一设备。
- WAF:接入云厂商Web应用防火墙。
13.微服务:一个服务更新怎么通知其他服务
- 事件驱动 (推荐):更新服务发布消息到MQ (RocketMQ/Kafka),其他服务订阅消费。解耦,最终一致性。
- HTTP回调:更新成功后,主动调用其他服务接口(需处理重试和幂等)。
- 监听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.怎么优化性能,怎么做选型
- 优化 :
- 缓存 (Redis) 抗读。
- 异步 (MQ) 抗写/削峰。
- 索引 提速查询。
- 池化 (连接池/线程池) 复用资源。
- 扩容 (加机器/分库分表)。
- 选型 :
- 看数据量 (万级MySQL,亿级HBase/ES)。
- 看读写比 (读多写少加缓存)。
- 看一致性要求 (强一致选DB,最终一致选ES/MQ)。
- 看团队熟悉度 (运维成本)。
17.什么是冷热分离,有哪些业务场景
是什么:将数据按访问频率分为热数据 (最近3个月,高频访问) 和冷数据 (历史数据,低频访问)。
场景:
订单表:近半年订单查得多,放高性能库/SSD;一年前订单归档到HDFS/廉价存储。
日志系统:近期日志查得多,老日志压缩存储。
好处:减小主表体积,提升热点查询速度,降低存储成本。
18.数据库表,字段,索引怎么设计
从需求出发,然后比如设计一个测试题的点击,如果测试题的用量在10w以下,感觉直接mysql就行;如果后面点击量大了,考虑并发的话,加入redis,然后往后考虑分库分表,冷热分离,熔断降级。
- 流程 :
- 需求分析:确定实体、关系、读写比例、数据量预估。
- 概念设计:画ER图。
- 逻辑设计 :转成表结构,定字段类型,建索引 (根据查询条件)。
- 物理设计:选引擎 (InnoDB),设字符集 (utf8mb4)。
- 演进路线 (以测试题点击为例):
- < 10w量:单表MySQL,正常索引。
- 并发高了 :加Redis计数器 (
incr),定时异步落库。 - 数据量大了 :按月/年分表 ,或分库。
- 历史数据 :做冷热分离,老数据归档。
- 极端流量 :加熔断降级 (非核心统计失败则丢弃),限流。