美团春招
2024年4月17日大约 5 分钟
美团春招
一、Linux 系统 & 进程管理 🐧
查看内存使用情况
free -h
total
/used
/free
/shared
/buff/cache
/available
-m
可按 MB 显示,更精确
top
/htop
- 按
%MEM
排序:Shift + M
- 查看 RES(常驻集大小)、VIRT(虚拟内存)、SWAP
- 按
vmstat 1 5
r
(运行队列)、b
(不可中断睡眠)、si
/so
(Swap 进出)
ps aux --sort=-%mem | head
:查看最耗内存进程
物理内存 vs 虚拟内存
- 物理:直接读写 DRAM
- 虚拟:CPU + MMU 分页,将虚拟地址映射到物理页框 + Swap
- 页表:记录映射关系
- 缺页中断:访问未映射页 → 内核加载或 Swap 交换
Swap 交换内存
- 用途:RAM 不够时,非热数据移到磁盘
- 优点:避免 OOM,临时“超配”
- 缺点:磁盘 I/O 慢 → 卡顿
- 调优:
swappiness
参数(0–100,越低越少用 Swap)
用户 & 用户组管理
useradd -m username
:同时创建家目录usermod -aG wheel username
:追加到 wheel 组(sudo)passwd -l username
/passwd -u username
:锁/解锁账户groupdel groupname
:删除组
用户态 vs 内核态
- 用户态:只能执行受限指令,APP 崩溃不拖垮内核
- 内核态:全权限,管理调度、中断、I/O
- 切换:通过软中断(系统调用)或硬中断
- 面试点:STI/CLI 指令、特权级(Ring 0/3)
进程间通信(IPC)
- 匿名管道
|
:仅限父子进程 - 命名管道
mkfifo /tmp/f
:任意进程打开读写 - 共享内存
shmget()/shmat()
:最快,需配信号量同步 - 消息队列
msgget()/msgsnd()/msgrcv()
:按消息类型过滤 - 信号量
semget()
:用于保护临界区 - Socket:支持本地(UNIX Domain)与网络通信
- 匿名管道
管道 vs 重定向
- 管道:无中介文件,直接内存传输。例:
ps aux | grep nginx
- 重定向:与文件交互。例:
grep error log.txt > errors.txt
- 管道:无中介文件,直接内存传输。例:
二、Linux 文件 & 权限管理 📁
查看文件内容
cat file
:小文件一键看全less file
:大文件翻页,支持正则搜索/pattern
head -n10 file
/tail -n20 file
(-f
实时追加)nl file
:带行号显示
修改权限 & 所有者
- 数字法
chmod 754 file
→ Owner=rwx (7), Group= r-x (5), Other= r– (4)
- 符号法
chmod g+w,o-r file
→ 给组写、去除其他读
chown alice:dev file
→ user=alice, group=dev- 粘滞位
/tmp
上常见:仅文件 owner 可删
- 数字法
文件操作
touch file
/>file
(清空)cp -r src/ dest/
(目录)mv file dir/
(移动/重命名)rm -rf dir/
(小心!)ln -s /path/to/src linkname
(软链接)
查找最近更新
find /var/log -type f -mtime -1
(24h)find . -type f -mmin -30
(30min)-iname "*.log"
(忽略大小写)
磁盘使用
df -hT
:显示文件系统类型 + 大小du -sh /home/*
:各家目录占用du --max-depth=2 -h /var
:分层查看
查看端口占用
ss -tulpen
:比netstat
更快lsof -i TCP:22
→ SSH 端口fuser -n tcp 80
:显示进程 PID
三、MySQL & 数据库设计 🛢️
A. SQL & 索引
GROUP BY vs HAVING
SELECT dept, COUNT(*) AS cnt FROM employees WHERE status='active' GROUP BY dept HAVING cnt > 10; -- HAVING 可用别名
JOIN 对比
INNER JOIN
:符合多表过滤LEFT JOIN
:保留左表所有行RIGHT JOIN
:保留右表所有行- 示例:客户–订单联查、保留无订单客户
深度分页
- 原始:
LIMIT 1000000, 10
→ 慢 - 优化:
WHERE id > (SELECT id FROM t ORDER BY id LIMIT 1000000,1) LIMIT 10
- 覆盖索引:只读索引字段,
force index
- 原始:
索引原理
- B+ 树:非叶子只存键,叶子串成链表 → 范围友好
- 空间换时间,写入时额外维护成本
何时加索引
- WHERE、JOIN、ORDER BY、GROUP BY 列
- 高选择性+覆盖率 推荐
- 避免过多索引(影响 DML 性能)
EXPLAIN
type
: ALL(全表)、index、range、ref、eq_ref、const 最优possible_keys
: 可用索引key
: 实际用上索引rows
: 预估扫描行数
聚集 vs 非聚集
- InnoDB 主键即聚集:物理排序
- 二级 索引存主键 → 回表
B. 并发 & 分布式
死锁避免
- 固定加锁顺序(ID 小→大)
SELECT … FOR UPDATE
加超时锁
悲观锁 vs 乐观锁
- 悲观:阻塞等待(行级锁)
- 乐观:CAS/版本号 + 重试
缓存策略
- 穿透:布隆过滤器提前拦截
- 击穿:热点永不过期 + 单点锁
- 雪崩:TTL 随机化 + 多级缓存
高并发计数器
- Redis
INCR key
:原子自增 - 分片:避免单点瓶颈
- Redis
四、计算机网络 🌐
GET vs POST
- GET:参数在 URL,幂等、可缓存、限长(≈2KB)
- POST:Body,非幂等、安全性高
HTTPS 原理
- 握手:证书(公钥)→ 客户端生成对称密钥 → 双方用对称加密通信
- 加密算法:RSA(非对称)、AES(对称)、HMAC(完整性)
三次握手
- C→S: SYN, Seq=x
- S→C: SYN+ACK, Seq=y, Ack=x+1
- C→S: ACK, Seq=x+1, Ack=y+1
四次挥手
- C→S: FIN
- S→C: ACK
- S→C: FIN
- C→S: ACK
粘包 & 拆包
- 原因:TCP 流无边界
- 解决:定长 / 分隔符(
\r\n
)/ 长度字段
UDP vs TCP
- UDP:轻量无连接,适合实时音视频,能接受丢包
- TCP:可靠、拥塞控制
广播 & 多播
- 广播:255.255.255.255 → 子网全体
- 多播:224.0.0.0–239.255.255.255 → 特定组
DNS 流程
浏览器→本地缓存→/etc/hosts
→本地 DNS→根→TLD→权威→返回DoS vs DDoS
- DoS:单机洪水
- DDoS:分布式僵尸网络
- 防护:黑洞路由、WAF、CDN、SYN Cookie
五、Java 核心 ☕️
接口 vs 抽象类
- 接口:
interface
,多实现,Java 8+ 可default
/static
方法 - 抽象:可含字段/构造器,支持
protected
方法
- 接口:
集合对比
- ArrayList:连续内存,扩容
+50%
,随机读快 - LinkedList:双链表,插入/删除无需搬移
- ArrayList:连续内存,扩容
finally
- 一定执行,即便
return
、抛异常 - 注意:
return
in finally 覆盖前值
- 一定执行,即便
ThreadLocal
ThreadLocal<Connection> tl = ThreadLocal.withInitial(() -> createConn()); Connection c = tl.get();
- 线程私有存储,key 为弱引用,需手动
remove()
避免泄漏
- 线程私有存储,key 为弱引用,需手动
六、分布式系统 & 高并发设计 🚀
高并发计数器
- Redis INCR + Hash 分片 + 本地 Cache + 异步合并
预约系统
- 时间粒度分片 + Redisson 分布式锁 + MQ 异步补偿
实时排行榜
- Flink sliding window → Redis ZSET/Top-N 堆
搜索权重
- ES 自定义
function_score
:TF‑IDF + CTR + 时间衰减
- ES 自定义
热点排行
- 滑动窗口统计 + 多级缓存 + 锁保护
大规模排队
- 公平 FIFO / VIP 优先 + Redis List + Sentinel HA
分布式事务
- Seata AT(2PC)/ MQ 事务消息 + 幂等补偿
缓存一致性
- 双删 + Binlog → Canal 同步 + 布隆过滤 + 随机 TTL