面试题答案
一键面试写入操作流程
- 内存写入:新的数据首先被写入到内存中的一个数据结构,通常是跳跃表(Skip List),这个结构称为 MemTable。MemTable 设计为便于快速插入和查找,能高效支持写入操作。
- MemTable 满溢处理:当 MemTable 达到一定大小(阈值)时,它会被冻结(Frozen),阻止新的写入,并将其转换为不可变的 MemTable。同时,一个新的可写 MemTable 被创建,继续接收新的写入。
- SSTable生成:不可变的 MemTable 会被刷写到磁盘,形成一个排序字符串表(Sorted String Table,SSTable)。SSTable 是按键有序存储的,这种有序性有助于后续的合并操作和快速查找。
读取操作流程
- 内存查找:首先在当前可写的 MemTable 中查找数据。如果在 MemTable 中找到数据,则直接返回,因为 MemTable 中的数据是最新的。
- SSTable查找:如果在 MemTable 中未找到,则按照层级顺序在磁盘上的 SSTable 中查找。由于 SSTable 是按键有序的,可以使用二分查找等高效算法进行查找。
- 合并结果:在不同层级的 SSTable 中可能存在相同键的不同版本数据,LSM 树需要合并这些结果,返回最新版本的数据。
LSM 树整体原理
LSM 树通过将写入操作先集中在内存中处理,然后批量刷写到磁盘,减少磁盘随机 I/O 的开销,从而提高写入性能。读取时虽然可能需要在多个层级的数据结构中查找,但通过 SSTable 的有序性和层级合并策略,仍然能保持相对高效的查找性能。这种结构特别适用于写入密集型的应用场景,如数据库系统中的持久化缓存。