【万字长文】使用 LSM-Tree 思想基于.Net 6.0 C# 实现 KV 数据库(案例版)

本文详细介绍了如何使用LSM-Tree(日志结构合并树)思想,基于.Net 6.0 C#语言实现一个键值对(KV)数据库。内容涵盖数据库实现的初衷、LSM-Tree的基本概念,以及详细的架构分析和实现步骤。文章讨论了MemoryTable、WAL Log、Immutable MemoryTable和SSTable等关键组件的工作原理,并提供了性能测试结果。
摘要由CSDN通过智能技术生成

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

文章有点长,耐心看完应该可以懂实际原理到底是啥子。

这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期。

当然,这个其实也算是NoSQL的雏形,有助于深入了解相关数据库的内部原理概念,也有助于实际入门。

适合对数据库原理以及实现感兴趣的朋友们。

整体代码,大概1500行,核心代码大概500行。

为啥要实现一个数据库

大概2018年的时候,就萌生了想自己研发一个数据库的想法了,虽然,造轮子可能不如现有各种产品的强大,但是,能造者寥寥无几,而且,造数据库的书更是少的可怜,当然,不仅仅是造数据库的书少,而是各种各样高级的产品的创造级的书都少。

虽然,现在有各种各样的开源,但是,像我这种底子薄的,就不能轻易的了解,这些框架的架构设计,以及相关的理念,纯看代码,没个长时间,也不容易了解其存在的含义。

恰逢其时,前一个月看到【痴者工良】大佬的一篇《【万字长文】使用 LSM Tree 思想实现一个 KV 数据库 》文章给我很大触动,让我停滞的心,又砰砰跳了起来,虽然大佬是用GO语言实现的 ,但是,对我来讲,语言还是个问题么,只要技术思想一致,我完全可以用C#实现啊,也算是对【痴者工良】大佬的致敬,我这边紧随其后。

当然,我自己对数据的研究也是耗时很久,毕竟,研究什么都要先从原理开始研究,从谷歌三个论文《GFS,MapReduce,BigTable》开始,但是,论文,毕竟是论文,读不懂啊,又看了网上各种大佬的文章,还是很蒙蔽,实现的时候,也没人交流,导致各种流产。

有时候,自己实现某个产品框架的时候,总是在想,为啥BUG都让我处理一个遍哦,后来一想,你自己从新做个产品,也不能借鉴技术要点,那还不是从零开始,自然一一遇到BUG。

下图就是,我在想做数据库后,自己写写画画,但是,实际做的时候,逻辑表现总没有那么好,当然,这个是关系型数据库,难度比较高,下面可以看看之前的手稿,都是有想法了就画一下。

实现难度有点高,现在这个实现是KV数据库,算是列式数据库了,大名鼎鼎的HBase,底层数据库引擎就是LSM-Tree的技术思想。

LSM-Tree 是啥子

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 和 SSTable),这三个部分。

先对关键词解释一下

MemoryTable

内存表,一种临时缓存性质的数据表,可以用 二叉排序树实现,也可以用字典来实现,我这边是用字典实现的。

WAL Log

WAL 英文 (Write Ahead LOG) 是一种预写日志,用于在系统故障期间提供数据的持久性,这意味着当写入请求到来时,数据首先添加到 WAL 文件(有时称为日志)并刷新到更新内存数据结构之前的磁盘。

如果用过Mysql,应该就知道BinLog文件,它们是一个道理,先写入到WAL Log里,记录起来,然后,写入到内存表,如果电脑突然死机了,内存里的东西肯定丢失了,那么,下一次重启,就从WAL Log 记录表里,从新恢复数据到当前的数据状态。

Immutable MemoryTable

Immutable(不变的),相对于内存表来讲,它是不能写入新数据,是只读的。

SSTable

SSTable 英文 (Sorted Strings Table) ,有序字符串表,就是有序的字符串列表,使用它的好处是可以实现稀疏索引的效果,而且,合并文件更为简单方便,我要查某个Key,但是,它是基于 某个有序Key之间的,可以直接去文件里查,而不用都保存到内存里。

这里我是用哈希表实现的,我认为浪费一点内存是值得的,毕竟为了快,浪费点空间是值得的,所以,目前

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值