Go存储引擎相关资料汇总

news2024/11/15 17:47:43

背景

​ 最近逛知乎的时候看到了这个问题,“Go语言如何写数据库?”。说来我业余时间在这个领域有一些时间精力的投入了,所以想回答一下。我投入的方向是存储引擎方面,所以这篇文章主要是总结一下我看过的一些比较好的Go存储引擎的资料。罗列一些论文,开源项目。读者可以自行去了解。

image-20230121161042677

什么是存储引擎?

​ 简单来说存储引擎就是存放和读取用户数据的地方,对于持久化的存储引擎而言,数据的归宿是非易失性的存储介质(通俗意义上来说就是磁盘)所以该以什么形式组织和存储数据,这就是存储引擎设计的艺术所在。这一块涉及到和操作系统打交道(主要是IO操作),还有如何更快的处理数据,这里涉及到并发事物如何处理,另外考虑空间局部性和时间局部性原理,这里涉及到对数据缓存的设计。整体来说scope还是比较大的,钻研空间比较广。下面推荐的是磁盘IO相关的文章和数据存储相关的视频资料。而这篇文章主要罗列的是Hash,B+Tree,LSM-Tree三种存储引擎的资料。

  1. 磁盘IO那些事
  2. 数据存储与检索(详解b+树存储引擎(innodb、boltdb、buntdb等)、lsm树存储引擎(bitcask、moss、pebble、leveldb等)

1. Hash

​ Hash存储引擎相对实现比较简单,这里就放在第一个讲了。Bitcask是hash存储引擎的典型实现,而Bitcask在go中有两个实现,nutsdb和rosedb,而nutsdb是我去年开始参与维护的,tiny-bicask是我写的一个简单版bitcask实现,目的是方便nutsdb社区小伙伴快速上手项目。下面是我推荐的bitcask相关资料和项目:

  1. Bitcask paper 论文地址。
  2. nutsdb github地址。
  3. rosedb github地址
  4. tiny-bitcask github地址
  5. nutsdb设计与实现 Go夜读分享
  6. rosedb 设计与实现Go夜读分享

2. B+Tree

​ B+ Tree是大家耳熟能详的一种存储引擎架构,大名鼎鼎的MySQL innodb存储引擎就是基于B+ Tree实现的。在Go中Boltdb是B+Tree的典型实现,其中著名的分布式存储etcd,底层用的是boltdb存储元数据。下面是B+Tree存储引擎的一些相关资料:

  1. Boltdb github代码地址。
  2. 自底向上分析 BoltDB 源码 电子书。
  3. Google B-Tree实现 内存版的B-tree实现。

3. LSM-Tree

LSM-Tree的典型代表有leveldb和rocksdb,目前主流的nosql数据库底层采用的存储引擎一般都是基于LSM-Tree实现的。而在go中有goleveldb和badgerdb两个实现,而badger是基于论文WiscKey实现的Key Value分离的LSM架构存储。

  1. LSM paper 论文地址。
  2. Wisckey paper 论文地址。
  3. goleveldb github地址
  4. badgerdb github地址
  5. leveldb hand-book leveldb源码分析。

总结

其实要怎么写数据库,我觉得这个问题还是太宽了,但是如果你对这方面确实感兴趣,可以先从学习相关理论,并且选一些开源项目去研究源码,必要时候可以参与到开源项目的开发之中。没有比实际动手写更好的学习方式了。另外在后面的学习过程中还会有更多优秀的学习资料,所以打算把这些资料整理到github项目里面,后面方便维护,https://github.com/elliotchenzichang/go-database-material,大家对这方面感兴趣的话可以star和提PR,感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二维费用背包问题

二维费用背包问题一、问题二、思路1、状态表示2、状态转移3、循环设计4、注意三、代码一、问题 二、思路 这道题归根结底还是背包问题的一种,面对背包问题,我们的思路就是面对前i个物品的时候,我们的第i个物品是选还是不选,如果条…

关于ARM的向量中断控制器NVIC

学习或者了解过ARM的朋友应该都会知道NVIC这么个东西,这个东西也是ARM中非常重要的东西,它是ARM不可分离的部分,搭配着内核共同完成着对中断的响应。 1、那到底NVIC是个啥东西呢? NVIC:简称嵌套向量中断控制器。它管理…

【new操作符做了什么 —— js】

🧁个人主页:个人主页 ✌支持我 :点赞👍收藏🌼关注🧡 文章目录new操作符具体做了什么?🎈创建了一个空的对象✨将空对象的原型,指向于构造函数的原型🍧将空对象…

【操作系统】—— Windows卸载与清除工具“ Geek 与 CCleaner ” (带你快速了解)

📜 “作者 久绊A” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴。 🍁 操作系统【带你快速了解】对于电脑来说,如果说…

day23-网络编程01

1.网络编程入门 1.1 网络编程概述【理解】 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计…

微服务框架需要处理哪些问题?

文章目录简述架构选择统一版本管理基础框架包管理业务框架包管理模型分层全局上下文管理数据结构定义上下文的传播前后端数据格式协定统一数据格式字段规范协定异常处理orm配置公共字段处理分页处理字段加解密缓存key的序列化哪些数据进行缓存消息队列key的规范队列的管理注册中…

34.Isaac教程--操作示例应用程序

操作示例应用程序 ISAAC教程合集地址文章目录操作示例应用程序与 Jupyter Notebook 的简单联合控制Shuffle Box with Simulator与 Jupyter Notebook 的简单联合控制 此示例使用 Jupyter Notebook 提供交互式联合控制。 这是处理用于操作组件(包括 LQR 规划器&#…

PowerShell 执行策略

在使用 SAPIEN 的PowerShell Studio时出现如下错误:无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 ERROR: 所在位置 行:1 字符: 2 ERROR: …

python基础——函数编程

python基础——函数编程 文章目录python基础——函数编程一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤一、实验目的 掌握函数编程 二、实验原理 在Python中,定义函数的语法如下: def 函数名([参数列表]): ‘’‘注解’…

【人人都是算法专家】一文搞定AI算法竞赛(全网最详细)

Rocky Ding公众号:WeThinkIn写在前面 【人人都是算法专家】栏目专注于分享Rocky在AI行业中业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习💪 大家好,我是Rocky。 之前Rocky总结过很多关于AI算法竞赛的方法论、经验思考以及细节…

分享123个ASP源码,总有一款适合您

ASP源码 分享123个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 123个ASP源码下载链接:https://pan.baidu.com/s/17G9rpRpCJX_D-6DV0j4uFg?pwd3rx8 提取码&#x…

qt json tree 读取json树状结构并显示

1.介绍 用qt的相关的几个类处理json格式的信息 json内容: { "root":{"sites": [{ "name":"菜鸟教程" , "url":"www.runoob.com" }, { "name":"google" , "url":&quo…

QT环境的搭建安装:VsCode及Qt Creator

前言: vscode的界面美观,并且和QT一样的跨平台,所以可以选择vscode作为开发环境。   QT5.9.X版本成熟,相应教程丰富,并且5.9.9版本具有生成CMake功能,所以本文以QT5.9.9版本为例,给出QT环境的…

美团出品 | YOLOv6 v3.0 is coming(性能超越YOLOv7、v8)

🚀🚀🚀美团出品 | YOLOv6 v3.0 is coming !!✨✨✨ 一、前言简介 🎄🎈 📚 代码地址:美团出品 | YOLOv6 3.0代码下载地址 📚 文章地址:https://a…

仿写Dubbo-Java反射

概念 反射是Java的一个特性,反射允许程序运行时动态获取类的所有信息以及对其进行操作。反射在框架(spring,springboot,mybatis等)中的使用非常的广发,可谓是框架的灵魂。 获取Class对象 在使用反射之前,需要获取到Cla…

工欲善其事必先利其器——Elasticsearch安装

安装使用说明 首先在elasticsearch官网下载你想要安装的版本,我这里使用的是7.12.1版本 上传到你想要安装的目录(/user/search/) 然后解压,解压命令如下: tar -zxvf elasticsearch-7.12.1-linux-x86_64.tar.gz 解压后…

创建保存字符串的数组numpy.char以及用于处理字符串数组的函数

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】创建字符串数组numpy.char.array()修改字符串数组大小写capitalize();title();lower();upper()[太阳]选择题对于以下python代码title()方法输出的结果是?imp…

【并发编程十二】c++20线程同步——信号量(semaphore)

【并发编程十二】c20线程同步——信号量(semaphore)一、互斥二、条件变量三、future四、信号量1、信号量原理2、c 20 信号量3、demo简介: 本篇文章,是线程同步的最后一篇。我们详细的介绍下c标准库提供的线程同步方法——信号量&a…

嵌入式Linux-线程创建与终止

1. 线程的创建 1.1 创建线程 启动程序时,创建的进程只是一个单线程的进程,称之为初始线程或主线程,本小节我们讨论如何创建一个新的线程。 创建线程与创建进程的方法是一样的,让我们来看一下创建线程的函数: #incl…

Linux基本功系列之chown命令实战

文章目录一. 前言🚀🚀🚀二. chown命令介绍三. 语法格式及常用选项四. 参考案例3.1 改变指定文件的属组和属主3.2 改变指定文件的所属主与所属组,并显示过程3.3 改变指定目录及其内所有子文件的所属主与所属组3.4 只修改文件所属组…