# 1. B-Tree vs LSM 的取舍,写少读多 vs 写多读多? A B-Tree 写快 B B-Tree 读快写弱适读多写少,LSM 写快读弱适写多场景 ✓ 正确答案 C LSM 读快 D 两者读写性能相同
# 2. LSM 树(Log-Structured Merge Tree)的写优化原理,内存表 + 磁盘 SSTable 合并? A 写入先到 WAL 与内存表,顺序刷盘成 SSTable,后台合并,写放大低 ✓ 正确答案 B LSM 随机写 C LSM 无内存表 D LSM 读快
# 3. 跳表在 Redis SortedSet 的应用? A SortedSet 用数组 B Redis SortedSet 用跳表实现有序与按分数范围查询,O(log n) 操作 ✓ 正确答案 C SortedSet 用哈希即可 D 跳表不支持范围查询
# 4. LSM 的典型实现,LevelDB、RocksDB、Cassandra、HBase? A LSM 只用于嵌入式 B 所有 LSM 实现相同 C MySQL 是 LSM D LevelDB/RocksDB 是嵌入式 LSM,Cassandra/HBase 是分布式 LSM NoSQL ✓ 正确答案
# 5. LSM 的写放大(Write Amplification)与读放大(Read Amplification)? A Compaction 不产生放大 B LSM 无写放大 C LSM 无读放大 D 写放大源于 Compaction 重复读写,读放大源于多级查询,可用 Bloom Filter 缓解读放大 ✓ 正确答案
# 6. LSM 的压缩(Compaction)策略,Size-Tiered、Leveled、Universal? A Size-Tiered 写放大低读放大高,Leveled 读放大低写放大高,按读写权衡选择 ✓ 正确答案 B 所有策略相同 C Leveled 写放大低 D Size-Tiered 读放大低
# 7. 跳表(Skip List)的原理,多层有序链表,平均 O(log n) 查找? A 跳表由多层有序链表组成,查找从顶层下探,平均 O(log n),实现简单 ✓ 正确答案 B 跳表是单层链表 C 跳表最坏 O(log n) D 跳表需旋转平衡
# 8. LSM 的 MemTable 与 SSTable 架构? A SSTable 在内存 B MemTable 在磁盘 C MemTable 是内存有序缓冲,SSTable 是磁盘有序存储,WAL 保证持久性,Compaction 合并 ✓ 正确答案 D 无 WAL
# 9. 跳表的查找/插入/删除操作如何通过"抛硬币"决定层数实现概率平衡,为什么平均 O(log n)、最坏 O(n),与红黑树相比实现复杂度与缓存友好性如何? A 跳表最坏 O(log n) B 抛硬币决定层数实现概率平衡,平均 O(log n)、最坏 O(n),实现比红黑树简单 ✓ 正确答案 C 跳表需旋转平衡 D 跳表实现比红黑树复杂
# 10. LSM 的 Compaction 触发策略与写入路径(WAL 组提交、MemTable flush)如何协同控制写放大与延迟尖刺? A WAL 组提交不相关 B Compaction 无需限流 C WAL 组提交减少 fsync、适度 MemTable 大小、Compaction 限流协同控制写放大与延迟尖刺 ✓ 正确答案 D flush 总造成延迟尖刺
# 11. LSM 的读路径如何依赖 Bloom Filter 与多级缓存(Block Cache)控制读放大?点查与范围扫描各有何特征? A Bloom Filter 无作用 B Bloom Filter 过滤不存在的 key、Block Cache 缓存热块,点查快、范围扫描读放大高 ✓ 正确答案 C 范围扫描点查快 D 点查读放大高
# 12. Cassandra 的 SSTable 合并? A SSTable 可变 B Cassandra 不合并 C Compaction 合并重叠 SSTable、清理冗余与墓碑,默认 Size-Tiered 策略 ✓ 正确答案 D 合并无策略
# 13. LSM 的删除标记(tombstone)? A tombstone 无空间影响 B 删除立即清除数据 C 删除写入 tombstone 标记,Compaction 时清理,需及时处理避免空间浪费 ✓ 正确答案 D tombstone 立即清理
# 14. LevelDB 与 RocksDB 的差异? A LevelDB 功能更强 B 两者完全相同 C RocksDB 是 LevelDB 优化版,支持列族、事务、多样 Compaction 策略,性能更强 ✓ 正确答案 D RocksDB 更简单
# 16. Bloom Filter 在 LSM 读路径中的作用,为什么它能把不存在的 key 的磁盘访问降到零,误判率与空间如何权衡,还有哪些替代结构? A 误判率与空间无关 B Bloom Filter 有假阴性 C Bloom Filter 无假阴性,可跳过不存在的 key 的 SSTable,误判率与空间成正比,替代有 Cuckoo/Xor Filter ✓ 正确答案 D Bloom Filter 无法过滤
# 17. LSM 的空间放大(Space Amplification)问题,SSTable 之间的数据冗余如何量化,compaction 策略如何权衡空间放大与写放大? A 空间放大反映 SSTable 冗余,Leveled 空间放大低写放大高,Size-Tiered 相反 ✓ 正确答案 B Leveled 空间放大高 C 空间放大与 Compaction 无关 D Size-Tiered 写放大高
# 18. RocksDB 的 Column Family 与 WAL 在写入路径中的作用,多 CF 共享 WAL 的崩溃一致性,为什么 WAL 必须先于 MemTable 持久化? A WAL 可丢失 B WAL 后于 MemTable 写 C 各 CF 独立 WAL 无一致性 D 多 CF 共享 WAL 保证跨 CF 崩溃一致,WAL 先于 MemTable 持久化便于崩溃后重放恢复 ✓ 正确答案
# 19. Cassandra 的 LSM 实现? A Cassandra 用 B-Tree B 写入先到 Memtable 再刷成 SSTable,Commit Log 保证持久性,Compaction 合并 ✓ 正确答案 C Cassandra 无 Memtable D Cassandra 随机写
# 20. LSM 存储引擎在分布式系统中的读修复(read repair)与 Compaction 如何协作,Cassandra 的 hint 与墓碑清理(gc_grace_seconds)对一致性的影响? A 读修复保证副本一致、Compaction 清理冗余,hint 保证写送达,gc_grace_seconds 避免删除复活 ✓ 正确答案 B 读修复与 Compaction 无关 C gc_grace_seconds 立即清理墓碑 D hint 与一致性无关