感觉小林 coding 的 ai 面试助手有点意思,不知道实现的架构怎么样,后期打算完成主线任务的同时去试试实现一个自己的 ai 面试助手。不知道难度怎么样!
1. Redis Cluster 是什么?
Redis Cluster 是 Redis 官方提供的分布式集群方案,核心目标是同时解决两个问题:
- 数据分片:把数据分散到多个 master 节点上,突破单机内存和单机写入瓶颈。
- 高可用:每个 master 可以配置 replica,master 故障后 replica 可以自动晋升为新 master。
典型结构如下:
Redis Cluster
Master1 Master2 Master3
slots 0-5460 slots 5461-10922 slots 10923-16383
| | |
Replica1 Replica2 Replica3
自动装箱与拆箱
自动装箱(Autoboxing)和自动拆箱(Unboxing)是 Java 编译器提供的语法糖,用来在基本类型和包装类型之间自动转换。
- 自动装箱:
int -> Integer - 自动拆箱:
Integer -> int
int a = 10;
Integer b = a; // 自动装箱
Integer c = 20;
int d = c; // 自动拆箱
G1(Garbage First)是 JDK 9+ 的默认垃圾收集器,通过 Region 分区设计从根本上解决了 CMS 的内存碎片问题,并实现了可预测的停顿时间控制。
Java 集合,HashMap、Hashtable、ConcurrentHashMap 这几个类很容易被混在一起。
表面上看,它们都像是“键值对容器”,但如果往并发场景里一放,差别就会立刻出来:
HashMap线程不安全Hashtable是线程安全的,但锁太粗ConcurrentHashMap既要保证线程安全,又希望尽量把并发性能保住
前面顺着文件 I/O、阻塞 / 非阻塞、零拷贝一路往下看时,很快就会碰到另一组在服务端开发里绕不开的概念:
- I/O 多路复用
selectpollepoll- 就绪事件
- 非阻塞 socket
这一块如果只是背结论,其实很容易卡在几个似懂非懂的地方,比如:
- 为什么一个线程也能管很多连接
epoll_wait()到底在等什么- 为什么
epoll还属于同步 I/O - 为什么工程里几乎总是
epoll + 非阻塞 - LT 和 ET 到底差在哪
这里主要整理操作系统视角下和网络 I/O、事件驱动、数据搬运路径相关的内容。
目前已经补上的内容主要包括:
- 零拷贝、mmap 和 sendfile
- I/O 多路复用:select、poll、epoll
- Reactor 模式
后面会继续补阻塞 / 非阻塞 socket、Reactor、网络缓冲区、用户态与内核态协作等内容。
前面把 I/O 多路复用、非阻塞、epoll 这些概念理顺之后,再往下看服务端代码怎么组织时,很快就会碰到一个绕不开的词:
- Reactor
这个词如果只看定义,其实很容易觉得有点虚。因为它既不是具体的系统调用,也不是某个固定函数名,而更像是一种写服务器的方式。
我一开始最容易混的点,是把:
epoll- 事件循环
- 线程池
- Reactor
全部揉成一团。
后来慢慢顺下来之后,我现在更愿意先把最核心的话立住:
前面把目录项、 inode、dentry、fd、硬链接这些概念理顺之后,再往下看文件系统时,很快就会碰到另一组特别容易混在一起的词:
- 文件 I/O
- 阻塞 / 非阻塞
- 同步 / 异步
- 缓冲 I/O
- 直接 I/O
- page cache
fsync
这些概念之所以容易乱,不是因为它们都难,而是因为它们其实不在同一个层面上。
有的在描述:
- 怎么打开和读写文件
前面把文件 I/O、page cache、直接 I/O 这些内容顺了一遍之后,再往下看网络传输和文件发送时,我发现还有一块特别容易听懂关键词、但一串起来就开始乱的内容:
- 零拷贝
mmapsendfile- DMA
- page cache
- socket 发送缓冲
一开始我对“零拷贝”这个词的直觉是:是不是数据完全不拷贝了,直接从磁盘飞到网卡?后来越看越发现,不是这么回事。
更准确地说:

