# FuXun And Zhuoshe
# Sticky
nodejs 事件循环机制(timers >> I/O callback >> idle,prepare >> poll >> check >> close callback)
浏览器和 Node 中 事件循环区别 (浏览器:每次循环处理一个宏任务后清空微任务队列)
# Nodejs 后端
# Events
Node 中的 EventEmitter 是什么(观察者模式)
- prependListener 头部添加(unshift),on、once、addListener 尾部添加(push)
实现一个 EventEmitter(创建一个类,并维护一个obj[arr])
# Stream
说说对 Node 中 Stream 的理解?(source、dest、pipe、单位是Buffer)
Node Stream 是什么?有哪些种类的 Stream?(读、写、双工 Duplex、转换 Transform = zlib)
# pipe 相比与 data 监听的好处
自动背压处理:当读取流比写入流还快时,自动暂停读取,避免内存爆炸
代码简洁:不用手动写
on('data')和on('drain')错误处理:默认 pipe 返回目标流,可以链式调用
# Net
# Buffer
什么是Buffer?为什么需要它?(继承自Uint8Array,用于二进制数据处理,创建后大小不可变)
# Nest.js 框架
Nestjs 数据初始化的时机 (OnApplicationBootstrap)
req/res 与 ExecutionContext 的核心区别(上下文可以获取Controller、路由、装饰器的元数据)
顺序:中间件 > 守卫 > 拦截器
中间件无法获取上下文,可以修改,用于数据预处理,通过 AppModule.config 注册
守卫器可以获取上下文,不可以修改,用于角色、权限的验证,@UseGuards 使用
拦截器可以获取上下文,可以修改,用于统一格式响应、异常映射、缓存处理,@UseInterceptors
# 数据库相关 Mongodb / Redis / Mysql / PostGreSql
# MongoDB
什么是 MongoDB?适合什么场景?(文档型数据库,适合非结构化数据、日志、内容管理)
MongoDB 索引类型有哪些?(单字段、复合、多键、文本、地理空间、哈希索引)
MongoDB 的聚合管道是什么?($match、$group、$project 等阶段处理数据)
# Redis
Redis 为什么快?(纯内存存储、单线程模型、IO 多路复用)
Redis 数据类型有哪些?(String、Hash、List、Set、ZSet、Stream、Bitmap 等)
- 缓存穿透:查询不存在的数据 >> 布隆过滤器、缓存空值
- 缓存击穿:热点 key 过期 >> 互斥锁、热点数据永不过期
- 缓存雪崩:大量 key 同时过期 >> 过期时间加随机值、熔断降级
Redis 持久化机制有哪些?(RDB 快照、AOF 日志、混合持久化)
Redis 的过期策略和内存淘汰算法?(定时删除、惰性删除 + LFU/LRU)
# MySQL
- InnoDB:支持事务、行锁、外键、崩溃恢复
- MyISAM:表锁、不支持事务、读性能好
什么是索引?索引类型有哪些?(主键、唯一、普通、联合、全文索引)
B+ 树索引的原理?为什么 MySQL 选 B+ 树?(层高低、范围查询快、磁盘 IO 少)
- 原子性、一致性、隔离性、持久性
事务隔离级别有哪些?(读未提交、读已提交、可重复读、串行化)
什么是 MVCC?(多版本并发控制,通过 undo log 实现读不加锁)
MySQL 慢查询如何优化?(explain 分析、索引优化、避免 select *、分页优化)
# PostgreSQL
PostgreSQL 相比 MySQL 的优势?(更好的并发控制、支持 JSON和数组)
什么是 MVCC?PostgreSQL 如何实现?(通过元组中的 xmin/xmax 实现)
PostgreSQL 索引类型有哪些?(B-tree、Hash、GiST、GIN、SP-GiST)
# Graphql 基础
GraphQL 核心概念(gql、Query Resolver、Mutation Resolver)
GraphQL 和 REST 有什么区别(允许前端自由选择字段,避免over-fetch)