A fast and lightweight key-value DB library made by Google
key-value : NO-SQL
lightweight library : Embeded 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++)
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 하면 됨.
여러 확장 모듈들은 여기서참고
level-db의 장점은 빠른 batch수행임.
db.batch(array[, options][, callback])
(array form)
batch()
can be used for very fast bulk-write operations (both put and delete). Thearray
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 => 김정일 이란다ㅋㅋㅋㅋ
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에서 사용함.