简介:

LevelDB是一个基于本地文件的存储引擎,非分布式存储引擎,原理基于BigTable(LSM文件树),无索引机制,存储条目为Key-value。适用于保存数据缓存、日志存储、高速缓存等应用,主要是避免RPC请求带来的延迟问题。在存取模型上,顺序读取性能极高,但是对于随机读取的情况延迟较大(但性能也不是特别低),比较适合顺序写入(key),随机的key写入也不会带来问题。数据存量通常为物理内存的3~5倍,不建议存储过大的数据,在这个数据量级上,leveldb的性能比那些“分布式存储”要高(即本地磁盘存取延迟小于RPC网络延迟)。

1)如果你的log日志或者视频片段需要暂存在本地,稍后再批量发给远端的数据中心,那么这种需求非常适合使用leveldb做数据缓冲。(这些缓存的数据被切分成多个小的chunks,以key-value的方式保存在leveldb中)

2)如果你希望构建一个本地cache组件,但是cache的数据可能比内存容量要大,此时我们就可以使用leveldb做支撑,leveldb将一部分热区数据保存在内存,其他数据保存在磁盘上,可以并发的、随机读取key-value。但是数据不能太大,否则磁盘读取的延迟将很大,此时应该使用分布式缓存。(当然,分布式缓存是用于解决分布式环境中数据同步、一致性的问题,不仅仅是数据量过大的问题)

特点:

下面是LevelDB官方对其特性的描述,主要包括如下几点:

key和value都是任意长度的字节数组;

entry(即一条K-V记录)默认是按照key的字典顺序存储的,当然开发者也可以重载这个排序函数;

提供的基本操作接口:Put()、Delete()、Get()、Batch();

支持批量操作以原子操作进行;

可以创建数据全景的snapshot(快照),并允许在快照中查找数据;

可以通过前向(或后向)迭代器遍历数据(迭代器会隐含的创建一个snapshot);

自动使用Snappy压缩数据;

可移植性;

架构:

LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口。为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度。从静态角度,可以假想整个系统正在运行过程中(不断插入删除读取数据),此时我们给LevelDb照相,从照片可以看到之前系统的数据在内存和磁盘中是如何分布的,处于什么状态等;从动态的角度,主要是了解系统是如何写入一条记录,读出一条记录,删除一条记录的,同时也包括除了这些接口操作外的内部操作比如compaction,系统运行时崩溃后如何恢复系统等等方面。

本节所讲的整体架构主要从静态角度来描述,之后接下来的几节内容会详述静态结构涉及到的文件或者内存数据结构,LevelDb日知录后半部分主要介绍动态视角下的LevelDb,就是说整个系统是怎么运转起来的。

LevelDb作为存储系统,数据记录的存储介质包括内存以及磁盘文件,如果像上面说的,当LevelDb运行了一段时间,此时我们给LevelDb进行透视拍照,那么您会看到如下一番景象:

图1.1:LevelDb结构

从图中可以看出,构成LevelDb静态结构的包括六个主要部分:内存中的MemTable和Immutable MemTable以及磁盘上的几种主要文件:Current文件,Manifest文件,log文件以及SSTable文件。当然,LevelDb除了这六个主要部分还有一些辅助的文件,但是以上六个文件和数据结构是LevelDb的主体构成元素。

LevelDb的Log文件和Memtable与Bigtable论文中介绍的是一致的,当应用写入一条Key:Value记录的时候,LevelDb会先往log文件里写入,成功后将记录插进Memtable中,这样基本就算完成了写入操作,因为一次写入操作只涉及一次磁盘顺序写和一次内存写入,所以这是为何说LevelDb写入速度极快的主要原因。

Log文件在系统中的作用主要是用于系统崩溃恢复而不丢失数据,假如没有Log文件,因为写入的记录刚开始是保存在内存中的,此时如果系统崩溃,内存中的数据还没有来得及Dump到磁盘,所以会丢失数据(Redis就存在这个问题)。为了避免这种情况,LevelDb在写入内存前先将操作记录到Log文件中,然后再记入内存中,这样即使系统崩溃,也可以从Log文件中恢复内存中的Memtable,不会造成数据的丢失。

当Memtable插入的数据占用内存到了一个界限后,需要将内存的记录导出到外存文件中,LevleDb会生成新的Log文件和Memtable,原先的Memtable就成为Immutable Memtable,顾名思义,就是说这个Memtable的内容是不可更改的,只能读不能写入或者删除。新到来的数据被记入新的Log文件和Memtable,LevelDb后台调度会将Immutable Memtable的数据导出到磁盘,形成一个新的SSTable文件。SSTable就是由内存中的数据不断导出并进行Compaction操作后形成的,而且SSTable的所有文件是一种层级结构,第一层为Level 0,第二层为Level 1,依次类推,层级逐渐增高,这也是为何称之为LevelDb的原因。

SSTable中的文件是Key有序的,就是说在文件中小key记录排在大Key记录之前,各个Level的SSTable都是如此,但是这里需要注意的一点是:Level 0的SSTable文件(后缀为.sst)和其它Level的文件相比有特殊性:这个层级内的.sst文件,两个文件可能存在key重叠,比如有两个level 0的sst文件,文件A和文件B,文件A的key范围是:{bar, car},文件B的Key范围是{blue,samecity},那么很可能两个文件都存在key=”blood”的记录。对于其它Level的SSTable文件来说,则不会出现同一层级内.sst文件的key重叠现象,就是说Level L中任意两个.sst文件,那么可以保证它们的key值是不会重叠的。这点需要特别注意,后面您会看到很多操作的差异都是由于这个原因造成的。

SSTable中的某个文件属于特定层级,而且其存储的记录是key有序的,那么必然有文件中的最小key和最大key,这是非常重要的信息,LevelDb应该记下这些信息。Manifest就是干这个的,它记载了SSTable各个文件的管理信息,比如属于哪个Level,文件名称叫啥,最小key和最大key各自是多少。下图是Manifest所存储内容的示意:

图2.1:Manifest存储示意图

图中只显示了两个文件(manifest会记载所有SSTable文件的这些信息),即Level 0的test.sst1和test.sst2文件,同时记载了这些文件各自对应的key范围,比如test.sstt1的key范围是“an”到 “banana”,而文件test.sst2的key范围是“baby”到“samecity”,可以看出两者的key范围是有重叠的。

Current文件是干什么的呢?这个文件的内容只有一个信息,就是记载当前的manifest文件名。因为在LevleDb的运行过程中,随着Compaction的进行,SSTable文件会发生变化,会有新的文件产生,老的文件被废弃,Manifest也会跟着反映这种变化,此时往往会新生成Manifest文件来记载这种变化,而Current则用来指出哪个Manifest文件才是我们关心的那个Manifest文件。

以上介绍的内容就构成了LevelDb的整体静态结构,在LevelDb日知录接下来的内容中,我们会首先介绍重要文件或者内存数据的具体数据布局与结构。

使用(Java API):

1.引入依赖

引入第三方提供的连接依赖:

iq80依赖,在maven Repository上可以看到最新版本

如果你的本地仓库com.google.guava包没有或是版本较低,请更换为高版本,否则在连接时,可能会因为版本过低导致第三方iq80依赖中使用的google.common包中的方法找不到而抛出异常。

两个都需要更换高版本

2.获取一个DB连接

第三方依赖无需任何XML配置,因为levelDB官方已经提出,他们不提供数据库的服务支持,需要自行封装,levelDB有着很好的封装性,所以这一点可以比较便利地达成。

获取DB连接

file需要指定存放数据的路径,类似于我们手动指定mysql中.db文件存放的位置。

这里通过iq80的打开一个连接,并指定数据存储的文件夹,Options是一个设置类,可以对连接进行初始化设置,这里只设置了当连接不存在时则创建。

3.增删查

levelDB提供了增删查功能,数据均通过byte[]的形式存储到文件中。

分别为增加,查找,删除

levedb 导入 mysql_LevelDB-初始篇相关推荐

  1. levedb 导入 mysql_leveldb研究3-数据库日志文件格式

    //读取记录,scratch为缓冲,record是结果boolReader::ReadRecord(Slice*record, std::string*scratch) {if(last_record ...

  2. 红茶一杯话Binder(初始篇)

    红茶一杯话Binder (初始篇) 1 什么是Binder? 简单地说,Binder是Android平台上的一种跨进程交互技术.该技术最早并不是由Google公司提出的,它的前身是Be Inc公司开发 ...

  3. 实现微信小程序编译和运行环境系列(初始篇)

    实现微信小程序编译和运行环境系列(初始篇) 前言 最近一段时间在研究实现微信小程序和小游戏编译打包和运行环境平台开发 目前基本可以支持微信基础库2.8.2功能迭代了 所以想通过记录分享一下自己的认知过 ...

  4. 大连理工大学开发区校区新生指南——1. 初始篇

    大连理工大学开发区校区新生指南--初始篇 写在前面的话 1.报道流程 1.1 从收到录取通知开始 1.2 来校前的物品准备 1.3 来学校的交通方式 1.4 入学报道手续办理 1.5 关于军训 写在前 ...

  5. MQTT初始篇笔记整理

    MQTT简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),基于TCP/IP 协议栈而构建,虽然叫消息队列遥测传输,但是她与消息队列毫无关系,她 ...

  6. springboot初始篇(一)

    SpringBoot 作为Spring家族里面新的架构,优点在于快速搭建服务,不用关心过多配置,XML配置和JAR配置. 对于习惯使用SSH或者SSM的同学,当你在使用一次SpringBoot开发服务 ...

  7. 静态导入 java面试_Java面试系列【静态导入】-静态导入,基础篇

    import是学习Java的人最熟悉不过的语句了,我们通过import语句导入类.但实际上我们对于import还有其他用法. import static 看一段代码: import java.util ...

  8. bulk es 删除_es数据导出导入(bulk篇)

    1.bulk是什么? bulk是可以通过API批量执行创建索引,新增数据,更新数据和删除数据到elasticsearch. POST _bulk { "index" : { &qu ...

  9. matlab保存和载入数据,matlab数据的导入导出-总结篇

    支持的导入和导出文件格式 下表显示了可以从 MATLAB 应用程序导入和导出的文件格式. 文件内容扩展名说明导入函数导出函数MATLAB 格式化数据MAT保存的 MATLAB 工作区 访问 MATLA ...

最新文章

  1. 近期活动盘点:工业大数据讲座、大数据自杀风险感知讲座、数据法学研讨会、海外学者短期讲学(12.3-12.13)
  2. P1192 台阶问题(递推)
  3. 为netbean配置C++编译环境
  4. Qt的qrc资源文件在Visual studio编译出的Qt程序中不能显示问题解决
  5. 1.web技术的前世今生
  6. 算法工程师面试题【集锦cv/ml/dl】
  7. 团队第一阶段冲刺——第七天
  8. 佳能102种相片风格_一位妈妈用蔬菜水果等,为女儿拍了一组相片,没想到在INS火了...
  9. python之str与bytes互转
  10. java 判断文件编码格式(支持zip)
  11. 你对自己未来五年的职业规划是什么
  12. Jzoj4699 Password
  13. android对cpu硬件要求,Android手机想用64位处理器?系统阻碍
  14. mysql中文显示标题列_我在数据库中建立的列名为英文的,但标题是中文的,在编程界面中显示的是英文的列名,怎样设置成中文的?...
  15. matlab儒略日转日期,将日期(年、月、日)转换为儒略日编号并返回日期
  16. Tableau文件管理
  17. 前端如何下载excel表格
  18. 记录——python与华为云数据库MYSQL的交互
  19. MBA-day25 最值问题-应用题
  20. dependencies 和 devDependencies区别

热门文章

  1. Xamarin中国技术社区及BXUG官网上线啦
  2. Quartz.NET 3.0 正式发布
  3. .Net 如何模拟会话级别的信号量,对http接口调用频率进行限制(有demo)
  4. Entity Framework Core 2.0 新特性
  5. 在IIS上部署你的ASP.NET Core项目
  6. powershell 运行策略
  7. Apache之三种工作模式和配置性能优化
  8. Git之撤销add操作
  9. Android之多线程----异步消息处理机制之Handler详解
  10. 实验报告类与对象水井问题_物业设施设备巡检检查对象、周期和频次