LevelDB数据库是Google编写的一个快速键值存储库,LevelDB应用了LSM (Log Structured Merge) 策略,lsm_tree对索引变更进行延迟及批量处理,它提供了从字符串键到字符串值的有序映射,调用者可以提供一个自定义比较函数来覆盖排序顺序。
功能介绍
键和值是任意的字节数组。
数据是按键排序存储的。
调用者可以提供一个自定义比较函数来覆盖排序顺序。
基本的操作是Put(key,value)、Get(key)、Delete(key)。
在一个原子批中可以进行多次修改。
用户可以创建瞬时快照,以获得数据的一致视图。
在数据上支持向前和向后迭代。
使用Snappy压缩库对数据进行自动压缩。
外部活动(文件系统操作等)通过虚拟接口中转,因此用户可以自定义操作系统的交互。
LevelDB的特点和限制如下:
特点:
1、key和value都是任意长度的字节数组;
2、entry(即一条K-V记录)默认是按照key的字典顺序存储的,当然开发者也可以重载这个排序函数;
3、提供的基本操作接口:Put()、Delete()、Get()、Batch();
4、支持批量操作以原子操作进行;
5、可以创建数据全景的snapshot(快照),并允许在快照中查找数据;
6、可以通过前向(或后向)迭代器遍历数据(迭代器会隐含的创建一个snapshot);
7、自动使用Snappy压缩数据;
8、可移植性;
限制:
1、非关系型数据模型(NoSQL),不支持sql语句,也不支持索引;
2、一次只允许一个进程访问一个特定的数据库;
3、没有内置的C/S架构,但开发者可以使用LevelDB库自己封装一个server;
更新日志
修正了格式,使其符合Google C++ Style Guide的要求。
特别导出Windows链接的WriteBatch::Handler内部类。
Merge pull request #665 from cheng-chang:coding.
Merge pull request #669 from pavel-pimenov:fix-readme-windows-mkdir.
Merge pull request #472 from zhoudayang:patch-1.
Merge pull request #339 from richcole-at-amazon:master.
用 CMake 构建恢复 soname 版本。
其他杂项清理、修复和改进。
写操作流程:
1、顺序写入磁盘log文件;
2、写入内存memtable(采用skiplist结构实现);
3、写入磁盘SST文件(sorted string table files),这步是数据归档的过程(永久化存储);
注意:
log文件的作用是是用于系统崩溃恢复而不丢失数据,假如没有Log文件,因为写入的记录刚开始是保存在内存中的,此时如果系统崩溃,内存中的数据还没有来得及Dump到磁盘,所以会丢失数据;
在写memtable时,如果其达到check point(满员)的话,会将其改成immutable memtable(只读),然后等待dump到磁盘SST文件中,此时也会生成新的memtable供写入新数据;
memtable和sst文件中的key都是有序的,log文件的key是无序的;
LevelDB删除操作也是插入,只是标记Key为删除状态,真正的删除要到Compaction的时候才去做真正的操作;
LevelDB没有更新接口,如果需要更新某个Key的值,只需要插入一条新纪录即可;或者先删除旧记录,再插入也可;