leveldb
【LevelDB】
LevelDB is a fast key-value storage library that provides an ordered mapping from string keys to string values.
- Keys and values are arbitrary byte arrays.
- Data is stored sorted by key.
- Callers can provide a custom comparison function to override the sort order. 自定义Comparator。
- The basic operations are Put(key,value),Get(key),Delete(key).
- Multiple changes can be made in one atomic batch. 批处理,原子化,高效。
- Users can create a transient snapshot to get a consistent view of data.
- Forward and backward iteration is supported over the data.
- Data is automatically compressed using the Snappy compression library.
- External activity (file system operations etc.) is relayed through a virtual interface so users can customize the operating system interactions.
【性能】
LevelDB性能非常突出,官方网站报道其随机写性能达到40万条记录每秒,而随机读性能达到6万条记录每秒。总体来说,LevelDb的写操作要大大快于读操作,而顺序读写操作则大大快于随机读写操作。
【Limitations】
- This is not a SQL database. It does not have a relational data model, it does not support SQL queries, and it has no support for indexes. 不支持结SQL查询。
- Only a single process (possibly multi-threaded) can access a particular database at a time. 一个数据库只能被单进程访问。
- There is no client-server support builtin to the library. An application that needs such support will have to wrap their own server around the library. 无网络模型。
[Synchronous Writes]
  By default, each write to leveldb is asynchronous: it returns after pushing the write from the process into the operating system.
默认所有到leveldb的写操作都是异步, 在把数据从进程交给操作系统后该写操作就返回.
The transfer from operating system memory to the underlying persistent storage happens asynchronously.
从操作系统到下层的持久存储是一个异步的过程.
  The sync flag can be turned on for a particular write to make the write operation not return until the data being written has been pushed all the way to persistent storage.
sync标致可打开, 以使得写操作到直至把数据写入到持久存储才返回.
  
The downside of asynchronous writes is that a crash of the machine may cause the last few updates to be lost.
异步写操作不利的一面是, 机器的崩溃会导致最后几个操作丢失.
  Note that a crash of just the writing process will not cause any loss since even when sync is false, an update is pushed from the process memory into the operating system before it is considered done.
当sync为false时,写进程的崩溃不会导致异步写操作丢失, 国为数据已经被写到了操作系统.
Asynchronous writes can often be used safely. For example, when loading a large amount of data into the database you can handle lost updates by restarting the bulk load after a crash. A hybrid scheme is also possible where every Nth write is synchronous, and in the event of a crash, the bulk load is restarted just after the last synchronous write finished by the previous run.
[Concurrency]
  A database may only be opened by one process at a time. The leveldb implementation acquires a lock from the operating system to prevent misuse. Within a single process, the same leveldb::DB object may be safely shared by multiple concurrent threads. I.e., different threads may write into or fetch iterators or call Get on the same database without any external synchronization (the leveldb implementation will automatically do the required synchronization). However other objects (like Iterator and WriteBatch) may require external synchronization. If two threads share such an object, they must protect access to it using their own locking protocol.
[Iteration]
The following example demonstrates how to print all key,value pairs in a database.
  
   The following variation shows how to process just the keys in the range [start,limit):
   

ReadOptions::snapshot may be non-NULL to indicate that a read should operate on a particular version of the DB state. If ReadOptions::snapshot is NULL, the read will operate on an implicit snapshot of the current state.Snapshots are created by the DB::GetSnapshot() method:
  
Note that when a snapshot is no longer needed, it should be released using the DB::ReleaseSnapshot interface. This allows the implementation to get rid of state that was being maintained just to support reading as of that snapshot.
leveldb的更多相关文章
- leveldb 性能、使用场景评估
		最近有个业务写远远大于读,读也集中在最近写入,这不很适合采用leveldb存储么,leveldb业界貌似ssdb用得挺广,花了两天时间就ssdb简单做下测试,以下总结. ssdb 是leveldb的r ... 
- leveldb源码分析--SSTable之Compaction
		对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ... 
- leveldb 学习。
		1)大概浏览了leveldb文档的介绍.本想逐步看代码,想想还是自己先实现一个看看如何改进. 2)完成了一个非常丑陋的初版,但是还是比初初版有进步. 3)key value的数据库,不允许有key重复 ... 
- 解决: org.iq80.leveldb.DBException: IO error: C:\data\trie\000945.sst: Could not create random access file.
		以太坊MPT树的持久化层是采用了leveldb数据库,然而在抽取MPT树代码运行过程中,进行get和write操作时却发生了错误: Caused by: org.fusesource.leveldbj ... 
- 用Qt Creator 对 leveldb 进行简单的读写
		#include <iostream> #include <string> #include <leveldb/db.h> #include <boost/l ... 
- leveldb 学习笔记之VarInt
		在leveldb在查找比较时的key里面保存key长度用的是VarInt,何为VarInt呢,就是变长的整数,每7bit代表一个数,第8bit代表是否还有下一个字节, 1. 比如小于128(一个字节以 ... 
- leveldb源码学习系列
		楼主从2014年7月份开始学习<>,由于书籍比较抽象,为了加深思考,同时开始了Google leveldb的源码学习,主要是想学习leveldb的设计思想和Google的C++编程规范.目 ... 
- LevelDB库简介
		LevelDB库简介 一.LevelDB入门 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询 ... 
- zookeeper + LevelDB + ActiveMQ实现消息队列高可用
		通过集群实现消息队列高可用. 消息队列在项目中存储订单.邮件通知.数据分发等重要信息,故对消息队列稳定可用性有高要求. 现在通过zookeeper选取activemq leader的形式实现当某个ac ... 
- leveldb.net对象读写封装
		leveldb是一个非常高效的可嵌入式K-V数据库,在.NET下有着基于win实现的包装leveldb.net;不过leveldb.net只提供了基于byte[]和string的处理,这显然会对使用的 ... 
随机推荐
- 瞎折腾之Mvc WebApi的使用以及跨域问题
			在公司经常会用到调用接口的情况,但是一直是用的webservice,我感觉真是太笨重了.虽然某些人感觉用的很爽.非常爽.比如说:公司在开发的时候需要对接另一组的接口,然后就只能是指定端口和ip到他的电 ... 
- UVa 12206 (字符串哈希) Stammering Aliens
			体验了一把字符串Hash的做法,感觉Hash这种人品算法好神奇. 也许这道题的正解是后缀数组,但Hash做法的优势就是编码复杂度大大降低. #include <cstdio> #inclu ... 
- UVa 10905 Children's Game
			注意!这不是单纯的字典序排序,比如90.9,应该是990最大 对字符串排序蛋疼了好久,因为别人说string很慢,所以一直没有用过. 看别人用string还是比较方便的,学习一下 对了,这里的cmp函 ... 
- BZOJ 3624 免费道路
			第一反应:这不先0后1做并查集就行了吗? 然后WA了... 哦....啊?哦...233 如果按顺序做并查集,有些0的边可能很重要(只能由它作为0连起两个联通块),但并没有被选. 于是先按1做并查集, ... 
- pageX, clientX ,screenX, offsetX, layerX, ,x的区别
			事件对象event的位置属性,这些参数比较容易混淆 1. pageX,pageY :IE不识别的,鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化,其实就是clientY ... 
- 免费的WebService
			天气预报Web服务,数据来源于中国气象局 Endpoint : http://www.webxml.com.cn/WebServices/WeatherWebService.asmx Disc ... 
- 查询mysql数据库表的信息(表大小、数据大小、索引大小)
			select * from information_schema.TABLES where information_schema.TABLES.TABLE_SCHEMA='databasename' ... 
- 2015-10-13 晴  tcp/ip卷1
			今年看tcp/ip卷1的内容.苦和甜来自外界,坚强则来自内心,来自一个人的自我努力. 只有勤奋和积极进取的人 才会赢得成功的人生.加油 
- mysql 错误代码汇总
			1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除 ... 
- 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)
			题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next! ... 
