Golang levelDB 구현 goleveldb 라이브러리 알아보기

오늘은 Golang으로 키와 값 저장하는 levelDB 구현한 goleveldb 라이브러리를 알아보려 합니다.

goleveldb 설치

우선 Golang의 환경을 구성하기 위해 https://golang.org/dl/ 에서 윈도우, 리눅스, 맥에서 설치 프로그램을 내려받을 수 있습니다.

맥에서 brew로 쉽게 설치할 수 있습니다.

brew install go

우분투에서도 apt로 쉽게 설치할 수 있습니다.

sudo apt-get install golang-go

go get으로 goleveldb 패키지를 설치합니다.

go get github.com/syndtr/goleveldb/leveldb

홈의 go 폴더에 goleveldb 소스코드와 패키지 파일이 생성됩니다.

예제

package main

해당 소스코드를 실행 파일로 인식하게 해주도록 main이라고 선언합니다.

import (
	"fmt"

	"github.com/syndtr/goleveldb/leveldb"
	"github.com/syndtr/goleveldb/leveldb/filter"
	"github.com/syndtr/goleveldb/leveldb/opt"
)

fmt와 leveldb를 가져옵니다.

func decode(b []byte) string {
	return string(b[:len(b)])
}

바이트 슬라이스를 문자열로 바꿔주는 함수를 미리 만듭니다.

func main() {
	db, err := leveldb.OpenFile("test_path/test_file", nil)
	if err != nil {
		panic(err)
	}

인자로 받은 경로를 바탕으로 leveldb 파일을 생성합니다.

	err = db.Put([]byte("key"), []byte("value"), nil)
	data, err := db.Get([]byte("key"), nil)
	fmt.Println(decode(data))

키와 값을 파일에 저장하여 키로 값을 찾습니다.

미리 만들어둔 decode 함수로 저장된 바이트를 문자열로 바꾸어 출력해줍니다.

	iter := db.NewIterator(nil, nil)
	for iter.Next() {
		key := iter.Key()
		value := iter.Value()
		fmt.Println(key, decode(value))
	}
	iter.Release()
	err = iter.Error()

데이터베이스의 값들을 iterator로 받아서 for문에 사용할 수 있습니다.

Release로 iterator를 해제하면 마무리됩니다.

	err = db.Delete([]byte("key"), nil)

Delete로 키와 값을 삭제할 수 있습니다.

	batch := new(leveldb.Batch)
	batch.Put([]byte("key1"), []byte("value1"))
	batch.Put([]byte("key2"), []byte("value2"))
	batch.Delete([]byte("key1"))
	err = db.Write(batch, nil)
	defer db.Close()

여러 개의 키와 값을 일괄로 처리할 수 있습니다.

	o := &opt.Options{
		Filter: filter.NewBloomFilter(10),
	}
	db, err = leveldb.OpenFile("test_path/test_BloomFilter", o)
	if err != nil {
		panic(err)
	}

	defer db.Close()
}

bloom filter를 사용할 수 있습니다.

Written on August 23, 2019