文章有点长,耐心看完应该可以懂实际原理到底是啥子。
这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期。
当然,这个其实也算是NoSQL的雏形,有助于深入了解相关数据库的内部原理概念,也有助于实际入门。
适合对数据库原理以及实现感兴趣的朋友们。
整体代码,大概1500行,核心代码大概500行。为啥要实现一个数据库
LSM-Tree 英文全称是 Log Structured Merge Tree (中文:日志结构合并树),是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了,磁盘批量的顺序写要远比随机写性能高的技术特点,来实现高写入吞吐量的存储系统的核心。
具体的说,原理就是针对硬盘,尽量追加数据,而不是随机写数据,追加速度要比随机写的速度快,这种结构适合写多读少的场景,所以,LSM-Tree被设计来提供比传统的B+树或者ISAM更好的写操作吞吐量,通过消去随机的本地更新操作来达到这个性能目标。
相关技术产品有Hbase、Cassandra、Leveldb、RocksDB、MongoDB、TiDB、Dynamodb、Cassandra 、Bookkeeper、SQLite 等
所以,LSM-Tree的核心就是追加数据,而不是修改数据。LSM-Tree 架构分析
内存表,一种临时缓存性质的数据表,可以用 二叉排序树实现,也可以用字典来实现,我这边是用字典实现的。WAL Log
WAL 英文 (Write Ahead LOG) 是一种预写日志,用于在系统故障期间提供数据的持久性,这意味着当写入请求到来时,数据首先添加到 WAL 文件(有时称为日志)并刷新到更新内存数据结构之前的磁盘。
如果用过Mysql,应该就知道BinLog文件,它们是一个道理,先写入到WAL Log里,记录起来,然后,写入到内存表,如果电脑突然死机了,内存里的东西肯定丢失了,那么,下一次重启,就从WAL Log 记录表里,从新恢复数据到当前的数据状态。Immutable MemoryTable
Immutable(不变的),相对于内存表来讲,它是不能写入新数据,是只读的。SSTable
SSTable 英文 (Sorted Strings Table) ,有序字符串表,就是有序的字符串列表,使用它的好处是可以实现稀疏索引的效果,而且,合并文件更为简单方便,我要查某个Key,但是,它是基于 某个有序Key之间的,可以直接去文件里查,而不用都保存到内存里。
这里我是用哈希表实现的,我认为浪费一点内存是值得的,毕竟为了快,浪费点空间是值得的,所以,目前是全索引加载到内存,而数据保存在SSTable里,当然,如果是为了更好的设计,也可以自己去实现有序表来用二分查找。
我这个方便实现了之后,内存会加载大量的索引,相对来讲是快的,但是,内存会大一些,空间换时间的方案。下面开始具体的流程分析
- keyvalue 数据长度:176
加载215 MB 1000000条数据条数据 耗时:2322 毫秒,也就是2秒(加载SSTable)
内存稳定后占用500MB左右。
稳定查询耗时: 百条查询平均每条查询耗时: 0毫秒。可能是因为用了字典的缘故,查询速度会快点,但是,特别点查询会有0.300左右的耗时个别现象。
查询keys,一百万条耗时3秒,这个有点耗时,应该是数据量太大了。
【万字长文】使用 LSM Tree 思想实现一个 KV 数据库
https://www.cnblogs.com/whuanle/p/16297025.html
肖汉松:《从0开始:500行代码实现 LSM 数据库》
https://mp.weixin.qq.com/s/kCpV0evSuISET7wGyB9Efg
cstack : 让我们建立一个简单的数据库
https://cstack.github.io/db_tutorial/
数据库内核杂谈 - 一小时实现一个基本功能的数据库
https://www.jianshu.com/p/76e5cb53c864
谷歌三大论文 GFS,MapReduce,BigTable 中的GFS和BigTable致谢名单
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |