现在首先实现内存的数据结构, 其实我一开始想直接用基于红黑树的std::map的, 但发现LevelDB和RocksDB使用的低层数据结构都是跳表, 主要是因为: 1. 跳表天然支持顺序遍历,适合 LSM Tree 的 Compaction 和范围查询 2. 跳表的代码实现和维护成本低 3. 跳表的插入更简单, 而红黑树需要通过左旋或右旋来保证黑色节点...
我的代码:ToniXWD/toni-lsm: A KV storage engine based on LSM Tree, supporting Redis RESP 欢迎点个Star !!! 1 缓存池原理与设计 1.1 缓存池的作用 在LSM Tree的实现中,数据读取是以Block为单位进行的。为了提高热点Block的读取效率,我们引入了缓存池(Cache Pool)。缓存池的主要作用主要是减少磁盘I/O, ...
在开始自己编写之前,我先简单介绍一下LSM-Tree(Log-Structured Merge Tree)的架构以及读写流程。 LSM-Tree它结合了日志和索引的特点,优化了写入和读取性能。每次写入都是采用append-only的方式,所以写入性能很高。 而作为代价,追加写入会造成存储放大,LSM-Tree时采用了多层SSTable的方式将数据堆叠在硬盘上。所以需要一...
Java type StorageComponent struct { memTable BalancedTree ssTableFiles []*SSTable sparseIndex map[string]int config Config wal *WAL bloomFilter *BloomFilter compressor Compressor} type Config struct { MemTableSizeThreshold int CompactionInterval time.Duration TreeType string BlockSize int1.2.3.4.5...
LSM tree (log-structured merge-tree) 是一种对频繁写操作非常友好的数据结构,同时兼顾了查询效率。LSM tree 是许多 key-value 型或日志型数据库所依赖的核心数据结构,例如 BigTable、HBase、Cassandra、LevelDB、SQLite、Scylla、RocksDB 等。 LSM tree 之所以有效是基于以下事实:磁盘或内存的连续读写性能远高于随...
笔者前段时间在学习数据结构时,恰好听说了 LSM Tree,于是试着通过 LSM Tree 的设计思想,自己实现一个简单的 KV数据库。 代码已开源,代码仓库地址:https://github.com/whuanle/lsm 笔者使用 Go 语言来实现 LSM Tree 数据库,因为 LSM Tree 的实现要求对文件进行读写、锁的处理、数据查找、文件压缩等,所以编码过...
从零开始实现一个lsm-tree 1 11:15 从零开始实现一个lsm-tree 2 12:03 从零开始实现一个lsm-tree 3 22:35 从零开始实现一个lms-tree 4 48:54 从零实现一个lsm-tree 5 22:01 从零实现一个lsm-tree 6 38:25 从零实现一个lsm-tree 7 22:22 从零实现一个lsm-tree 8 41:45 从零...
在实现LSM Tree(Log-Structured Merge Tree)时,Memtable和Write-Ahead Logging(WAL)是两个关键组件。它们在提供高性能、可靠性和持久性方面起着至关重要的作用。在本篇文章中,我们将深入探讨如何使用Go语言实现这两个组件。首先,我们来了解一下Memtable。Memtable是一个内存中的数据结构,用于存储最近写入的数据。它...
LSM-tree 是专门为 key-value 存储系统设计的,key-value 类型的存储系统最主要的就两个个功能,put(k,v):写入一个(k,v),get(k):给定一个 k 查找 v。 LSM-tree 最大的特点就是写入速度快,主要利用了磁盘的顺序写,pk掉了需要随机写入的 B-tree。关于磁盘的顺序和随机写可以参考:《硬盘的各种概念》 下图...
TreeType string BlockSize int 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. StorageComponent包括以下内容: MemTable用于快速内存写入。 用于持久存储的SSTtables。 SparseIndex和BloomFilter可优化读取操作。 预写日志(WAL)以保证数据持久性。