共識演算法-LevelDB
阿新 • • 發佈:2018-11-10
LevleDB 是什麼
- leveldb 是 google 兩位工程師使用 C++實現的單機版 k-v 儲存系統
- key 和 value 都是任意的位元組陣列,支援記憶體和持久化儲存
- 資料都是按照 key 排序,使用者可以重寫排序函式
- 包含基本的資料操作介面,Put(key,value),Get(key),Delete(key)
- 多操作可以當成一次原子操作
LevleDB 的侷限性
- leveldb 是非關係型資料庫,不支援 SQL 查詢也不支援索引
- 同一時間只支援單程序(支援多執行緒)訪問 db
- 不支援客戶端-伺服器模型,使用者需要自己封裝
LevelDB工作流程
LevelDB儲存介質分為記憶體和硬碟兩種
(一)記憶體:記憶體中有memtable 和immutable memtable
(二)硬碟:硬碟中有log檔案,manifest檔案,current檔案和sstable檔案
//DB的結構體 type DB struct { path string data map[string][]byte } //模擬開啟 func New(path string) (*DB, error) { self := DB{ path: path, data: make(map[string][]byte), } return &self, nil } //模擬關閉 func (self *DB) Close() error { return nil }
Put
//Put
func (self *DB) Put(key []byte, value []byte) error {
self.data[string(key)] = value
return nil
}
Get
//Get
func (self *DB) Get(key []byte) ([]byte, error) {
if v, ok := self.data[string(key)]; ok {
return v, nil
} else {
//取不到
return nil, fmt.Errorf("NotFound")
}
}
Delete
//Delete
func (self *DB) Del(key []byte) (error) {
if _, ok := self.data[string(key)]; ok {
delete(self.data, string(key))
return nil
} else {
return fmt.Errorf("NotFound")
}
}
模擬遍歷:
//定義
type Iterator interface {
Next() bool
Key() []byte
Value() []byte
Close() error
}
//定義一個鍵值對結構體
type Pair struct {
Key []byte
Value []byte
}
//定義迭代器
type DefaultIterator struct {
data []Pair
index int
length int
}
func NewDefaultIterator(data map[string][]byte) *DefaultIterator {
//建立預設迭代器
self := new(DefaultIterator)
self.index = -1
self.length = len(data)
for k, v := range data {
p := Pair{
Key: []byte(k),
Value: v,
}
//遍歷出的資料新增到data
self.data = append(self.data, p)
}
return self
}
//是否存在下一個值
func (self *DefaultIterator) Next() bool {
//若還有值,index加1
if self.index < self.length-1 {
self.index++
return true
}
return false
}
func (self *DefaultIterator) Key() []byte {
//判斷是否越界
if self.index == -1 || self.index >= self.length {
panic(fmt.Errorf("越界"))
}
return self.data[self.index].Key
}
func (self *DefaultIterator) Value() []byte {
//判斷是否越界
if self.index >= self.length {
panic(fmt.Errorf("越界"))
}
return self.data[self.index].Value
}
func (self *DefaultIterator) Close() error {
return nil
}