LEVEL-DB

brody·2020년 7월 21일
0

LEVEL-DB란?

A fast and lightweight key-value DB library made by Google

key-value : NO-SQL

lightweight library : Embeded DB

LEVEL-DB특징

  • 웹 애플리케이션용 DB를 위해 만들었다.

    데이터를 로컬에 저장하기 때문에 네트워크 유실등의 상황에 유리함.

    크롬의 indexedDB를 구현하기 위해 만듬

    IndexedDB는 사용자의 브라우저에 데이터를 영구적으로 저장할 수 있는 방법 중 하나입니다. IndexedDB를 사용하여 네트워크 상태에 상관없이 풍부한 쿼리 기능을 이용할 수 있는 웹 어플리케이션을 만들 수 있기 때문에, 여러분의 웹 어플리케이션은 온라인과 오프라인 환경에서 모두 동작할 수 있습니다. https://developer.mozilla.org/ko/docs/Web/API/IndexedDB_API/Using_IndexedDB

    Indexed Database API 또는 IndexedDB(과거 이름: WebSimpleDB)는 색인이 포함된 JSON 객체가 모여있는 트랜잭셔널 로컬 데이터베이스를 위해 W3C가 권고한[1] 웹 브라우저 표준 인터페이스의 하나이다. 웹사이트는 데이터베이스에서 영속적인 데이터를 모아서 저장할 수 있다. W3C는 2015년 1월 8일 IndexedDB 인터페이스를 위한 최종 권고안을 발행하였다.[2]

  • data is stored by key

    ordered map이기 때문에 iteration 비용이 저렴,

    forward / backward iteration is supported

  • basic operations are put / get / key

  • Users can create snapshot

  • Data is automatically compressed using the Snappy compression library

    snappy는 압축률은 높지 않지만 속도가 매우 빠름

    초당 250M압축, 초당 500M압축 해제

  • Key와 Value는 Byte Arrays 타입

  • 전체적으로 뛰어난 read/write

  • 이지만, value사이즈가 크면 write시 성능이 하락함

    구현상 key와 value를 적어도 두번 복사하기 때문. (?)

    역시나 update비용은 비쌈. delete and write이기때문

  • B-tree의 변형인 LSM이다.

설치

C++, node, python3로 지원하는데 node에 설치해보자. (https://www.npmjs.com/package/level)

npm install level
//level = levelup(node) + leveldown(C++)

간단히 파일에 put해보기

var level = require('level')
const db = level("./mydb");

const put = (key, value) => {
    db.put(key, value, function (err) {
        if(err) {
            console.log(err);
        }
        db.get(key, function (err, value) {
            if (err) {
                console.log(err);
            }
            console.log(value);
        });
    });
};

put("111", "ttt");

memory에 쓰려면 memdown 이라는 np를 install 하면 됨.

여러 확장 모듈들은 여기서참고

BATCH로 넣어보기

level-db의 장점은 빠른 batch수행임.

db.batch(array[, options][, callback]) (array form)

batch() can be used for very fast bulk-write operations (both put and delete). The array argument should contain a list of operations to be executed sequentially, although as a whole they are performed as an atomic operation inside the underlying store.

batch예시에 한국인이름이 있네? 싱기방기

const batch = () =>{
    var ops = [
        { type: 'del', key: 'father' },
        { type: 'put', key: 'name', value: 'Yuri Irsenovich Kim' },
        { type: 'put', key: 'dob', value: '16 February 1941' },
        { type: 'put', key: 'spouse', value: 'Kim Young-sook' },
        { type: 'put', key: 'occupation', value: 'Clown' }
    ]

    db.batch(ops, function (err) {
        if (err) return console.log('Ooops!', err)
        console.log('Great success dear leader!')
    })

    db.get('spouse', (err, value) =>{
        console.log("wow~", value);
    })
}

batch();
Great success dear leader!
wow~ Kim Young-sook

.... Yuri Irsenovich Kim => 김정일 이란다ㅋㅋㅋㅋ

BATCH를 chaining하기

const batchChain = () => {
    db.batch()
        .del('father')
        .put('binna', 'what?')
        .put('태황', 'what??')
        .put('지원', {"type":"mannerism", "age":32})
        .put('다연', '퇴근하구싶어요')
        .write(function () {
            console.log('Done!')
        })
}

batch는 위와 같이 chaining 할 수 있음.

그래서 어디에 쓰임?

LevelDB is used as the backend database for Google Chrome's IndexedDB and is one of the supported backends for Riak.[8] Additionally, Bitcoin Core and go-ethereum stores the blockchain metadata using a LevelDB database.[9] Minecraft Bedrock Edition uses a modified version for chunk and entity data storage.[10] Autodesk AutoCAD 2016 also uses LevelDB.

이더리움의 metadata를 저장. 마인크레프트의 entitiydata저장. AutoCad에서 사용함.

profile
일하며 하는 기록

0개의 댓글