区块链教程Fabric1.0源代码分析LevelDB KV数据库

简介:

Fabric 1.0源代码笔记 之 LevelDB(KV数据库)

1、LevelDB概述

LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。

LevelDB的特点:

  • key和value都是任意长度的字节数组;
  • entry(即一条K-V记录)默认是按照key的字典顺序存储的,当然开发者也可以重载这个排序函数;
  • 提供的基本操作接口:Put()、Delete()、Get()、Batch();
  • 支持批量操作以原子操作进行;
  • 可以创建数据全景的snapshot(快照),并允许在快照中查找数据;
  • 可以通过前向(或后向)迭代器遍历数据(迭代器会隐含的创建一个snapshot);
  • 自动使用Snappy压缩数据;
  • 可移植性;

Fabric中使用了goleveldb包,即https://github.com/syndtr/goleveldb/

goleveldb的基本操作:

  • 打开数据库,db, err:=leveldb.OpenFile("./db", nil)。作用就是在当前目录下创建一个db文件夹作为数据库的目录。
  • 存储键值,db.Put([]byte("key1"),[]byte("value1"),nil)。作用就是在数据库中存储键值对 key1-value1。leveldb数据库中对键值的操作都是byte格式化的数据。
  • 获取键值对,data,_ := db.Get([]byte("key1"),nil),获取key1对应的值。
  • 遍历数据库,iter := db.NewIterator(nil, nil),for iter.Next(){ fmt.Printf("key=%s,value=%sn",iter.Key(),iter.Value()) },iter.Release()。作用就是建立迭代器iter,然后依次遍历数据库中所有的数据并打印键和值,最后释放迭代器iter。
  • 关闭数据库,db.Close()。

Fabric中LevelDB代码,分布在common/ledger/util/leveldbhelper目录,目录结构如下:

  • leveldb_provider.go,定义了结构体Provider、Provider、UpdateBatch、Iterator及其方法。
  • leveldb_helper.go,定义了DB结构体及方法。

2、DB结构体及方法

DB结构体定义:对实际数据存储的包装。

type Conf struct {
    DBPath string //路径
}

type DB struct {
    conf    *Conf //配置
    db      *leveldb.DB //leveldb.DB对象
    dbState dbState //type dbState int32
    mux     sync.Mutex //锁

    readOpts        *opt.ReadOptions
    writeOptsNoSync *opt.WriteOptions
    writeOptsSync   *opt.WriteOptions
}
//代码在common/ledger/util/leveldbhelper/leveldb_helper.go

涉及如下方法:对goleveldb包做了封装。

func CreateDB(conf *Conf) *DB //创建DB实例
func (dbInst *DB) Open() //leveldb.OpenFile,创建并打开leveldb数据库(如目录不存在则创建)
func (dbInst *DB) Close() //db.Close()
func (dbInst *DB) Get(key []byte) ([]byte, error) //db.Get
func (dbInst *DB) Put(key []byte, value []byte, sync bool) error //db.Put
func (dbInst *DB) Delete(key []byte, sync bool) error //db.Delete
func (dbInst *DB) GetIterator(startKey []byte, endKey []byte) iterator.Iterator //db.NewIterator,创建迭代器
func (dbInst *DB) WriteBatch(batch *leveldb.Batch, sync bool) error //db.Write,批量写入
//代码在common/ledger/util/leveldbhelper/leveldb_helper.go

3、DBHandle结构体及方法

DBHandle结构体定义:封装DB,目的为给key添加dbName前缀,添加和拆除前缀通过constructLevelKey(h.dbName, key)和retrieveAppKey()实现。

type DBHandle struct {
    dbName string //DB名称
    db     *DB //type DB struct
}
//代码在common/ledger/util/leveldbhelper/leveldb_provider.go

涉及如下方法:

func (h *DBHandle) Get(key []byte) ([]byte, error) //h.db.Get
func (h *DBHandle) Put(key []byte, value []byte, sync bool) error //h.db.Put
func (h *DBHandle) Delete(key []byte, sync bool) error //h.db.Delete
func (h *DBHandle) WriteBatch(batch *UpdateBatch, sync bool) error //h.db.WriteBatch
func (h *DBHandle) GetIterator(startKey []byte, endKey []byte) *Iterator //h.db.GetIterator
//代码在common/ledger/util/leveldbhelper/leveldb_provider.go

补充UpdateBatch结构体及方法:

type UpdateBatch struct {
    KVs map[string][]byte
}
func NewUpdateBatch() *UpdateBatch //构造UpdateBatch
func (batch *UpdateBatch) Put(key []byte, value []byte) //batch.KVs[string(key)] = value
func (batch *UpdateBatch) Delete(key []byte) //batch.KVs[string(key)] = nil
//代码在common/ledger/util/leveldbhelper/leveldb_provider.go

补充Iterator结构体及方法:封装github.com/syndtr/goleveldb/leveldb/iterator。

type Iterator struct {
    iterator.Iterator
}
func (itr *Iterator) Key() []byte //itr.Iterator.Key()拆除dbName
func constructLevelKey(dbName string, key []byte) []byte //为key添加dbName
func retrieveAppKey(levelKey []byte) []byte //为key拆除dbName
//代码在common/ledger/util/leveldbhelper/leveldb_provider.go

4、Provider结构体及方法

Provider结构体定义:将单个物理LevelDB,虚拟为多个逻辑LevelDB

type Provider struct {
    db        *DB
    dbHandles map[string]*DBHandle
    mux       sync.Mutex
}
//代码在common/ledger/util/leveldbhelper/leveldb_provider.go

涉及方法如下:

func NewProvider(conf *Conf) *Provider {//创建并打开db,构造Provider
    db := CreateDB(conf)
    db.Open()
    return &Provider{db, make(map[string]*DBHandle), sync.Mutex{}}
}

//获取名称为dbName的leveldb句柄
func (p *Provider) GetDBHandle(dbName string) *DBHandle {
    p.mux.Lock()
    defer p.mux.Unlock()
    dbHandle := p.dbHandles[dbName]
    if dbHandle == nil {
        dbHandle = &DBHandle{dbName, p.db}
        p.dbHandles[dbName] = dbHandle
    }
    return dbHandle
}

//关闭leveldb
func (p *Provider) Close() {
    p.db.Close()
}
//代码在common/ledger/util/leveldbhelper/leveldb_provider.go
感谢关注兄弟连区块链教程分享!
相关文章
|
3月前
|
关系型数据库 MySQL 分布式数据库
PolarDB 与传统数据库的性能对比分析
【8月更文第27天】随着云计算技术的发展,越来越多的企业开始将数据管理和存储迁移到云端。阿里云的 PolarDB 作为一款兼容 MySQL 和 PostgreSQL 的关系型数据库服务,提供了高性能、高可用和弹性伸缩的能力。本文将从不同角度对比 PolarDB 与本地部署的传统数据库(如 MySQL、PostgreSQL)在性能上的差异。
178 1
|
3月前
|
监控 Java 应用服务中间件
达梦数据库DEM监控部署教程分享
达梦数据库DEM监控部署教程分享
91 2
|
23天前
|
SQL 关系型数据库 MySQL
Vanna使用ollama分析本地数据库
这篇文章详细介绍了如何使用Vanna和Ollama框架来分析本地数据库,实现自然语言查询转换为SQL语句并与数据库交互的过程。
78 7
Vanna使用ollama分析本地数据库
|
11天前
|
存储 SQL 关系型数据库
【入门级教程】MySQL:从零开始的数据库之旅
本教程面向零基础用户,采用通俗易懂的语言和丰富的示例,帮助你快速掌握MySQL的基础知识和操作技巧。内容涵盖SQL语言基础(SELECT、INSERT、UPDATE、DELETE等常用语句)、使用索引提高查询效率、存储过程等。适合学生、开发者及数据库爱好者。
27 0
【入门级教程】MySQL:从零开始的数据库之旅
|
29天前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
2月前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
2月前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
22天前
|
SQL 存储 数据库
初识SQL数据库教程——从入门到精通
随着信息技术的飞速发展,数据库技术已成为计算机领域的重要组成部分。作为最流行的数据库管理系统之一,SQL数据库广泛应用于各类企业和组织的数据管理中。本文将带领读者从入门到精通,学习SQL数据库的相关知识。一、SQL数据库概述SQL(StructuredQueryLanguage)是一种用于管理关系数
34 2
|
23天前
|
存储 分布式计算 数据库
阿里云国际版设置数据库云分析工作负载的 ClickHouse 版
阿里云国际版设置数据库云分析工作负载的 ClickHouse 版
|
23天前
|
SQL 自然语言处理 关系型数据库
Vanna使用ollama分析本地MySQL数据库
这篇文章详细介绍了如何使用Vanna结合Ollama框架来分析本地MySQL数据库,实现自然语言查询功能,包括环境搭建和配置流程。
123 0