以太坊源码之『数据持久化』

目录结构

  • database.go:封装了对levelDB的操作代码
  • interface.go:数据库接口
  • memory_database.go:提供一个测试使用的内存数据库
  • database_test.go:测试安全

levelDB:

  • google开发开源k-v存储数据库
  • 源码:https://github.com/syndtr/goleveldb
  • 特点:
  1. leveldb是一个持久化存储的KV系统,与redis相比,leveldb是将大部分数据存储到磁盘中。而redis是一个内存型的KV存储系统,会吃内存。
  2. leveldb在存储数据时,是有序存储的,也就是相邻的key值在存储文件中是按照顺序存储的
  3. 与其它KV系统一样,levelDb操作接口简单,基本操作也只包括增、删、改、查。也支持批量操作
  4. levelDb支持数据快照(snapshot)功能,可以使得读取操作不受到写操作的影响
  5. levelDb支持数据压缩,可以很好的减少存储空间,提高IO效率。
  • 限制
  1. 非关系型数据库,不支持sql查询,不支持索引
  2. 一次只允许一个进程访问一个特定的数据库

源码详解:

interface.go

  • 对levedb的数据库操作的封装
  • 单独处理时并发安全
  • 批量处理时不能并发操作数据库
package ethdb
// 批处理数据的最大值
const IdealBatchSize = 100 * 1024

// 同时支持单条数据写入与批量写入的操作
type Putter interface {
	Put(key []byte, value []byte) error
}

// 并发安全的数据库操作接口
type Database interface {
	Putter
	Get(key []byte) ([]byte, error)
	Has(key []byte) (bool, error)
	Delete(key []byte) error
	Close()
	NewBatch() Batch
}
// 批量操作,不能并发操作
type Batch interface {
	Putter
	ValueSize() int // amount of data in the batch
	Write() error
}

database.go

  • 新建ldb对象

  • 对interface中接口函数的实现
  1. 单条数据操作
  2. 批量操作
  • 对eth服务的监听以及数据统计

  • 引用
  1.  初始化创世区块
  2. 从指定的区块链数据库中创建本地区块链
  •  Metircs    

    geth --metrics    :可以启动性能指标收集和报告

  1. 概念:系统性能度量框架,如果我们需要为某个系统或者服务做监控、统计 等,就可以用到它。通常有5种类型
  2. Meters:监控一系列事件发生的速率,在以太坊最大的作用就是监控TPS。Meters会统计最近1min, 5min, 15min以及全部时间的速率。
  3. gauges:最简单的度量指标,统计瞬时状态,只有一个简单的返回值
  4. Histograms:统计数据的分布情况。比如最小值,最大值,中间值。中位数
  5. Timers:和meters类似,它是meters和histograms结果,histograms统计耗时,meter统计TPS
  6. counter:计数器

memory_database.go:内存数据库,主要用于测试

  • 关于内存数据库的相关结构定义
  • 单条数据操作
  • 批处理

猜你喜欢

转载自blog.csdn.net/super_lixiang/article/details/83511636