1.译:一文科普 RocksDB 工作原理
2.leveldb之数据存储结构
3.区块链的模型架构是什么
4.BoltDB源码解析(一)使用简介
译:一文科普 RocksDB 工作原理
RocksDB 是一种可持久化的、内嵌型的键值存储(KV 存储)。它旨在存储大量 key 及其对应的 value,常被用于构建倒排索引、文档数据库、SQL 数据库、windows源码树缓存系统和消息代理等复杂系统。RocksDB 在 年从 Google 的 LevelDB 分叉而来,针对 SSD 服务器进行了优化,并目前由 Meta 开发和维护。它以 C++ 编写,支持 C、C++ 及其他语言(如 Rust、Go、Java)的嵌入。如果你熟悉 SQLite,可以认为 RocksDB 是一种内嵌式数据库,需依赖应用层实现特定功能。
RocksDB 使用日志结构合并树(LSM-Tree)作为核心数据结构,这是一种基于多个有序层级的树形数据结构,可用于应对写密集型工作负载。LSM-Tree 的顶层是 MemTable,一个内存缓冲区,用于缓存最近的写入数据。较低层级的数据存储在磁盘上,以 L0 层为例,c linux源码存储从内存移动到磁盘的数据,其他层级存储更旧的数据。当某一层级的数据量过大时,会通过合并操作转移到下一层。
为了保证数据持久化,RocksDB 将所有更新写入磁盘上的预写日志(WAL)。当应用重启时,可以通过回放 WAL 来恢复 MemTable 的原始状态。WAL 是一个只允许追加的文件,包含一组更改记录序列,每个记录包含键值对、操作类型和校验和。
当 MemTable 变满时,会触发刷盘(Flush)操作,将不可变的 MemTable 内容持久化到磁盘,并丢弃原始 MemTable,同时开始写入新的 WAL 和 MemTable。MemTable 默认基于跳表实现,以提高查询和插入效率。RocksDB 支持各种压缩算法,如 Zlib、BZ2、Snappy、LZ4 或 ZSTD,用于存储 SST 文件。flans动画源码
SST 文件是 MemTable 刷盘后生成的,包含了有序的键值对。每个 SST 文件由数据部分和索引块组成,数据部分包含一系列有序的键值对,而索引块存储了数据块中最后一个键的偏移量,便于快速定位键值对。RocksDB 还支持布隆过滤器,用于快速检测某个键是否存在于 SST 文件中。
当数据库大小增加时,空间放大(存储数据所用实际空间与逻辑大小的比值)和读放大(用户执行一次逻辑读操作所需实际 IO 次数)的问题变得明显。为了解决这些问题,RocksDB 实现了 Compaction 机制,通过合并 SST 文件来降低空间和读放大,同时增加写放大。Leveled Compaction 是默认策略,它会在不同层级之间进行选择性合并,以优化空间使用。
RocksDB 的读路径相对简单,主要涉及从 MemTable 开始,下探到 L0 层,然后继续向更低层级查找,直到找到目标键或检查完整个树。合并(merge)操作允许用户在内存中对键值进行聚合操作,适用于需要对已有值进行少量更新的场景。然而,inno setup 源码这种操作增加了读时的复杂性,因为读操作需要在多次调用 merge 函数后才能得到最终结果。
使用 RocksDB 需要针对特定工作负载进行配置调优,因为它提供了许多可配置项,但理解其内部原理并调整这些配置通常需要深入研究源代码。RocksDB 是构建高性能数据库模块的优秀选择,能够帮助开发者专注于上层业务逻辑实现,而无需从零开始设计底层存储系统。
leveldb之数据存储结构
leveldb中的数据存储结构设计巧妙,尽管在源码中编码和反编码较为复杂,但理解时可以将其当作黑盒子。本文主要讨论几个关键组件:Slice、Varint/、InternalKey、Comparator、SSTable、DataBlock、IndexBlock、FilterBlock、MetaIndexBlock以及Log和WriteBatch。
Slice是一个轻量级的数据结构,类似Go语言的切片,用于方便传递和引用数据子串,尤其在处理C++标准库中的std::string时,Slice更轻便,隐藏table源码不需复制子串。
Varint/是变长编码,用于节省存储空间,如位整型,通过MSB和后续7位表示数据,最长可编码到5字节。这种编码方式使得数字存储更加紧凑。
InternalKey是存储用户数据的关键,由user_key、sequence和type组成,sequence用于版本控制和数据合并,type区分值类型和删除标记。删除时,leveldb通过日志追加而非直接修改,确保数据一致性。
Comparator接口用于自定义key的比较逻辑,而InternalKeyComparator结合user_comparator,通过用户键和序列进行排序,保证新数据在旧数据的前面。
SSTable由DataBlock、MetaIndexBlock和IndexBlock组成,DataBlock采用前缀压缩和重启点设计,提高了空间效率。IndexBlock则用于记录DataBlock的映射,采用跳点策略来压缩key。
FilterBlock在构建Block的同时生成BloomFilter,用于快速过滤查找。MetaIndexBlock存储元信息到MetaBlock的映射。
Footer用于文件校验和解析,包含索引和元数据信息。MemTable使用skiplist结构,支持高效查找,通过墓碑标记删除,保持数据一致性。
Log负责持久化数据,避免内存丢失。WriteBatch用于批量操作,保证原子性,并进行序列化,便于数据恢复。
区块链的模型架构是什么
目前市场上区块链培训课程跨度很大,课程内容和授课形式也是五花八门。区块链
1、编程基础入门
计算机软硬件基础、字符集及字符编码、HTMLCSS(含HTML5CSS3)、ECMABOMDOM、jQuery、node.js、Ajax及Express
2、Go编程语言
Go基本语法、流程控制、函数及数据、错误处理、Go面向对象编程、Go并发编程、Go网络编程、Go安全编程、Go进阶编程(goroutine、channel)、数据库MySQL、LevelDB
3、区块链1.0——比特币Bitcoin
比特币原理、比特币系统架构、密码算法(Go语言实现)、共识算法(Go语言实现)、比特币交易原理及交易脚本、比特币RPC编程(node.js实现)、比特币源码解析
4、区块链2.0——以太坊Ethereum
以太坊工作原理及基础架构、以太坊基本概念(账户、交易、Gas)、以太坊钱包Mist及Metamask、以太坊交易、ERC标准Token开发部署、以太坊开发IDE——remix-ide、智能合约与Solidity、Solidity部署、备份及调用、框架技术:truffle及web3、DApp开发实战、Geth
5、区块链3.0——超级账本之Fabric
超级账本项目介绍、Fabric部署和使用、Fabric配置管理、Fabric架构设计、Fabric CA应用与配置、应用开发实战。
BoltDB源码解析(一)使用简介
BoltDB是一个纯Go语言实现的key value存储,提供库形式而非独立server进程。它是一个简单的存储系统,不支持SQL,但用户可以通过Bolt的API对key value进行增删查改。
使用BoltDB只需一个文件作为DB的持久化文件。与一般数据库不同,Bolt没有单独的日志文件,也不像LevelDB那样需要创建多个文件并执行Compaction。Bolt以mmap内存映射的方式打开DB文件,增删查改操作直接在内存中进行,操作系统负责磁盘和内存之间的数据传输。
Bolt支持Bucket概念,可以理解为namespace,用于分类组织不同类别的数据。用户可以创建多个Bucket来组织数据,例如在电商网站中,可以将users、orders、items数据分别放入不同的Bucket。
以下是一个示例程序,展示了BoltDB的常规操作:
bolt.Open用于传入要使用的DB文件参数,并返回一个db实例。db.Close用于关闭数据库。
db.Update的入参是一个function,这是Bolt支持transaction的方式。db.View的入参也是一个function,但transaction只能是只读的。
CreateBucketIfNotExists根据名称打开或创建Bucket。
bucket.Put(key, value)将一对key value写入Bucket,若key已存在,则用新value替换旧value。
val := bucket.Get(key)返回key对应的value,若key不存在,则返回nil。
Bolt还支持Cursor概念,用于按照key顺序遍历DB。Cursor支持prefix scan和range scan,具体介绍可参考Bolt的README。
可能有同学疑惑,Bolt似乎只能存储string类型数据,如何存储结构化数据?实际上,Bolt不关心value的结构,将其视为字节序列。我们可以将结构化数据序列化为字节序列存储在Bolt中,使用时再反序列化为结构。Go语言中的序列化反序列化方法(如JSON、Gob、Protobuffers等)均可用于此。
Bolt的基本使用介绍到此,接下来将进行源码解析。