zoukankan      html  css  js  c++  java
  • 玩转Leveldb原理及源码--拙见1

    可以说是不知天高地厚。。

    可以说是班门弄斧。。

    但是,我今天还就这样走了,我喜欢!!!!!!


    注:后续文章,限于篇幅,不懂名词都有 紫色+下划线 超链接,有兴趣,可以查阅;


    网上关于Leveldb 的源码剖析啊,解析啊什么的有好多,差不多都是大神级别的在搞,如果我们水平相当,那不如凑一对呗:

    既然开始了,哪有停下的道理,先了解一下Levedb的关荣历史、完美现在和光辉的未来:

    Leveldb:

    1.Leveldb是一个google实现的非常高效的kv数据库,目前能够支持billion级别的数据量了。 

    在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计,特别是LMS算法。

    2.LevelDB 是单进程的服务,性能非常之高,在一台4核Q6600的CPU机器上,

    每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。

    3.LevelDB 只是一个 C/C++ 编程语言的库(有没有超级感动,哈)

    4.Leveldb只是一个语言库,不包含网络服务封装, 所以无法像一般意义的存储服务器(如 MySQL)那样, 用客户端来连接它.

    LevelDB 自己也声明, 使用者应该封装自己的网络服务器(这得等我学网络啦)

    5.LevelDB具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,

    也就是说LevelDB很适合应用在查询较少,而写很多的场景。

    LevelDB应用了LSM (不懂吧,点这里)策略,lsm_tree不懂吧,点这里对索引变更进行延迟及批量处理,

    并通过一种类似于归并排序的方式高效地将更新迁移到磁盘,降低索引插入开销。

    6.key和value都是任意长度的字节数组;
    7.entry(即一条K-V记录)默认是按照key的字典顺序存储的,当然开发者也可以重载这个排序函数;
    8.提供的基本操作接口:Put()、Delete()、Get()、Batch();
    9.支持批量操作以原子操作进行;
    10.可以创建数据全景的snapshot(快照),并允许在快照中查找数据;
    11.可以通过前向(或后向)迭代器遍历数据(迭代器会隐含的创建一个snapshot);
    12.自动使用Snappy压缩数据;
    13.可移植性;

    以下是百度来的资料加一整理:如果了解,可以略过:

    Jeff Dean其人:http://research.google.com/people/jeff/index.html

       Google大规模分布式平台Bigtable和MapReduce主要设计和实现者。

    Sanjay Ghemawat其人:http://research.google.com/people/sanjay/index.html

       Google大规模分布式平台GFS,Bigtable和MapReduce主要设计和实现工程师。


       LevelDb就是这两位大神级别的工程师发起的开源项目,简而言之,LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++程序库。正像上面介绍的,这二位是Bigtable的设计和实现者,如果了解Bigtable的话,应该知道在这个影响深远的分布式存储系统中有两个核心的部分:Master Server和Tablet Server。其中Master Server做一些管理数据的存储以及分布式调度工作,实际的分布式数据存储以及读写操作是由Tablet Server完成的,而LevelDb则可以理解为一个简化版的Tablet Server。

    LevelDb有如下一些特点:

        首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。

        其次,LevleDb在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数,LevleDb会按照用户定义的比较函数依序存储这些记录。

        再次,像大多数KV系统一样,LevelDb的操作接口很简单,基本操作包括写记录,读记录以及删除记录。也支持针对多条操作的原子批量操作。

        另外,LevelDb支持数据快照(snapshot)功能,使得读取操作不受写操作影响,可以在读操作过程中始终看到一致的数据。

        除此外,LevelDb还支持数据压缩等操作,这对于减小存储空间以及增快IO效率都有直接的帮助。

        LevelDb性能非常突出,官方网站报道其随机写性能达到40万条记录每秒,而随机读性能达到6万条记录每秒。总体来说,LevelDb的写操作要大大快于读操作,而顺序读写操作则大大快于随机读写操作。

  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/melons/p/5791855.html
Copyright © 2011-2022 走看看