Go 存储系列:LSM存储引擎 LevelDB

news/2024/7/7 21:56:57

概念介绍

LSM-Tree 被是一种面向写多读少应用场景的数据结构 ,被 Hbase、RocksDB 等强力 NoSQL 数据库采用作为底层文件组织方式。

简单的LSM-Tree 包含 2 层树状数据结构:

  • Memtable 并完全驻留在内存中(假设 T0)

  • SStables 存储在磁盘中(假设 T1)
    在这里插入图片描述

  • 记录会先从 memtable T0 组件中读取,如果没有,则会从 SStables T1 组件中读取

  • 新记录被插入到 memtable T0 组件中。 如果插入导致 T0 组件超过某个大小阈值,则会从 T0 中删除连续的条目段并将其合并到磁盘上的 T1 中。

LSM-Tree

Memtable

MemTable是在内存中的数据结构,用于保存最近更新的数据,会按照Key有序地组织这些数据,LSM树对于具体如何组织有序地组织数据并没有明确的数据结构定义,例如Hbase使跳跃表来保证内存中key的有序。

因为数据暂时保存在内存中,内存并不是可靠存储,如果断电会丢失数据,因此通常会通过WAL(Write-ahead logging,预写式日志)的方式来保证数据的可靠性。

SSTables (Sorted String Table )

有序键值对集合,是LSM树组在磁盘中的数据结构。为了加快SSTable的读取,可以通过建立key的索引以及布隆过滤器来加快key的查找。

数据合并

由于我们将数据作为 SSTable 存储在磁盘中,假设有 N 个 SSTable,每个表的大小为 M,那么最坏情况读取时间复杂度是 O(N* Log(M) ),因此,随着 SSTable 数量的增加,读取时间复杂度也会增加。
另外,当我们刚刚刷新数据库中的 SSTable 时,多个 SSTable 中存在相同的 Key,LSM 会使用Compactor,Compactor 在后台运行,合并 SSTables 并删除具有相同行的多行,并添加带有最新数据的新键,并将它们存储在新的合并/压缩的 SSTable 中。

goleveldb 中LSM树实现

  • https://github.com/justinethier/keyva/
  • https://github.com/syndtr/goleveldb

http://lihuaxi.xjx100.cn/news/1693120.html

相关文章

2、Flowable基础表结构

Flowable基础表结构 1.表结构讲解 工作流程的相关操作都是操作存储在对应的表结构中,为了能更好的弄清楚Flowable的实现原理和细节,我们有必要先弄清楚Flowable的相关表结构及其作用。在Flowable中的表结构在初始化的时候会创建五类表结构,具…

typescript实现一个简单的区块链

TypeScript 是一种由 Microsoft 推出的开源编程语言,它是 JavaScript 的超集,允许程序员使用面向对象的方式编写代码,并提供类型检查和语法提示等优秀的开发体验。区块链技术是一种分布式的、可靠的、不可篡改的数据库技术,用于记…

蓝桥杯每日一题2023.10.19

题目描述 完全二叉树的权值 - 蓝桥云课 (lanqiao.cn) 题目分析 我们以每一个节点的坐标来将这一深度的权值之和相加从而算出权值和 要清楚每一个深度的其实节点和末尾节点,使用双指针将这个深度节点的权值和计算出来,记录所 需要的深度即可 #includ…

GO 工程下载依赖操作流程(go mod)

1. 写一个main.go文件 package main import ("fmt""net/http""github.com/ClickHouse/clickhouse-go" ) func main() {fmt.Println("服务启动......")http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Requ…

乙酰基四肽-3/Acetyl Tetrapeptide-3——刺激毛囊,长出新头发,有效防止秃头

社会对头发很着迷。从圣经人物参孙(他从头发中获得力量,并说如果剃光头他就会失去力量),到社交媒体上无休无止地谈论名人的标志性风格,头发是一个永恒的话题。 为什么痴迷?好吧,我们的头发是外…

滚动视图ScrollView

滚动视图分为两类:ScrollView(水平滚动视图) HorizontalScrollView(垂直滚动视图) 注意: (1)垂直滚动,layout_width要设为match_parent,layout_height要设为wrap_content。 (2)…

利用QT通过http协议,来实现上传文件功能

#假如你有一台服务器,你最想做哪些事?# 大体上的软件界面如下: 主要阐述一哈写的这个软件实现的功能: 通过名称找到指定的文件,并且将文件按照后缀名的格式进行分开,最后再将所有找到的文件,进…

中文编程语言开发工具开发的软件实例:洗车会员管理软件案例

中文编程语言开发工具开发的软件实例:洗车会员管理软件案例图片资料 上图说明:会员登记的时候,可以直接使用手机号,可以绑定车牌号, 上图说明:洗车软件可以一卡多用,一卡管理多个项目。 软件特…