目录结构
- database.go:封装了对levelDB的操作代码
- interface.go:数据库接口
- memory_database.go:提供一个测试使用的内存数据库
- database_test.go:测试安全
levelDB:
- google开发开源k-v存储数据库
- 源码:https://github.com/syndtr/goleveldb
- 特点:
- leveldb是一个持久化存储的KV系统,与redis相比,leveldb是将大部分数据存储到磁盘中。而redis是一个内存型的KV存储系统,会吃内存。
- leveldb在存储数据时,是有序存储的,也就是相邻的key值在存储文件中是按照顺序存储的
- 与其它KV系统一样,levelDb操作接口简单,基本操作也只包括增、删、改、查。也支持批量操作
- levelDb支持数据快照(snapshot)功能,可以使得读取操作不受到写操作的影响
- levelDb支持数据压缩,可以很好的减少存储空间,提高IO效率。
- 限制
- 非关系型数据库,不支持sql查询,不支持索引
- 一次只允许一个进程访问一个特定的数据库
源码详解:
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中接口函数的实现
- 单条数据操作
- 批量操作
- 对eth服务的监听以及数据统计
- 引用
- 初始化创世区块
- 从指定的区块链数据库中创建本地区块链
- Metircs
geth --metrics :可以启动性能指标收集和报告
- 概念:系统性能度量框架,如果我们需要为某个系统或者服务做监控、统计 等,就可以用到它。通常有5种类型
- Meters:监控一系列事件发生的速率,在以太坊最大的作用就是监控TPS。Meters会统计最近1min, 5min, 15min以及全部时间的速率。
- gauges:最简单的度量指标,统计瞬时状态,只有一个简单的返回值
- Histograms:统计数据的分布情况。比如最小值,最大值,中间值。中位数
- Timers:和meters类似,它是meters和histograms结果,histograms统计耗时,meter统计TPS
- counter:计数器
memory_database.go:内存数据库,主要用于测试
- 关于内存数据库的相关结构定义
- 单条数据操作
- 批处理