levedb 导入 mysql_LevelDB-初始篇

简介:

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进行透视拍照,那么您会看到如下一番景象:

9d0d2bf2e59cda55c0a0775c114149c1.png

图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所存储内容的示意:

90a2493eccf2384d101b385c280251f5.png

图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.引入依赖

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

format,png

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

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

format,png

两个都需要更换高版本

2.获取一个DB连接

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

format,png

获取DB连接

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

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

3.增删查

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

format,png

分别为增加,查找,删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#中的多义关键字

newnew用三种场景,最常用的实例化,泛型参数时的实例化约束,第三种是显式隐藏继承成员。using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using s…

当时我就震惊了:无穷带来的各种悖论

全世界有3.14 % 的人已经关注了数据与算法之美希尔伯特旅馆悖论(Hilberts paradox of Grand Hotel)希尔伯特旅馆有无限个房间,并且每个房间都住了客人。一天来了一个新客人,旅馆老板说:“虽然我们已经客满,…

重载运算符操作_学习

//A: 操作符重载实现为类成员函数 /* #include <iostream> class Person { private:int age; public:Person(int a){this->agea;}//inline bool operator(const Person &ps)const;inline bool operator(const Person *ps)const; }; //inline bool Person::operat…

砸了140亿的计算机视觉,未来到底如何?

指纹解锁、刷脸识别、语音转换文字、机器人看病、Alphago我们已经深刻的感受到&#xff0c;人工智能在改变我们的工作方式和认知。通过 SAS 针对企业人工自能就绪调研的报告可以看到&#xff0c;大部分企业认为人工智能还处于初期阶段&#xff0c;“目前&#xff0c;我们正在部…

记一次 .NET WPF布草管理系统 挂死分析

一&#xff1a;背景 1. 讲故事这几天看的 dump 有点多&#xff0c;有点伤神伤脑&#xff0c;晚上做梦都是dump&#xff0c;今天早上头晕晕的到公司就听到背后同事抱怨他负责的WPF程序挂死了&#xff0c;然后测试的小姑娘也跟着抱怨。。。嗨&#xff0c;也不知道是哪一个迭代改出…

轻量级HTTP服务器Nginx(安装篇)

一、下载与安装Nginx Nginx的官方网站是http://sysoev.ru/nginx/&#xff0c;英文主页为http://nginx.net&#xff0c;从这里可以获得Nginx的最新版本信息。Nginx有三个版本&#xff1a;稳定版、开发版和历史稳定版。开发版更新较快&#xff0c;包含最新的功能和bug的修复…

mysql视图实现的_mysql视图是什么?怎么实现?

mysql视图是什么&#xff1f;怎么实现&#xff1f;发布时间&#xff1a;2020-05-21 18:00:24来源&#xff1a;亿速云阅读&#xff1a;152作者&#xff1a;鸽子视图本身是一张虚拟表&#xff0c;不存放任何数据。在使用SQL语句访问视图的时候&#xff0c;获取的数据是MySQL从其它…

中国人的数学为什么好,为什么不好

全世界有3.14 % 的人已经关注了数据与算法之美世界人民已经懒得吐槽美国学生的数学水平了&#xff0c;正如他们已习惯于惊叹中国学生的天才。脱离计算器就不会四则运算&#xff0c;把sinx/n算成“six”&#xff0c;美国学生闹的笑话层出不穷&#xff0c;每隔一段时间&#xff0…

.NET Core 调用百度 PaddleOCR 识别图文

了解 PaddleOCR 之前&#xff0c;首先了解一下 PaddlePaddle。飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础&#xff0c;是中国首个开源开放、技术领先、功能完备的产业级深度学习平台&#xff0c;集深度学习核心训练和推理框架、基础模型库、端到端开发套…

SQL SERVER2000存储过程调试

sql server2000存储过程调试基础条件启用SQLDebugger 账户账户&#xff0c;这个一般都是开启的&#xff1b;mssqlserver服务要求使用指定用户(不是本地系统用户)&#xff0c;最好是administrator启动&#xff01;这个资料上这么说。但我用本地系统用户也是可以的&#xff1b;登…

华为机试支持python吗_4.10华为暑期实习生机试题目,python解答

第一题是给一个字符串&#xff0c;然后按照次数和ascii码的顺序&#xff0c;循环输出。比如输入eeefffggh&#xff0c;由于ascii的大小&#xff0c;e efgh efg ef efghefgef。字符串中可包含数字和大小写英文字母。 思路是先用dict统计个数&#xff0c;然后将所有可能…

大数据时代,数据科学都有些啥?

暑假咻地一下过完啦&#xff0c;前几天&#xff0c;小天介绍了关于数模课程的开学季限时优惠&#xff08;传送门&#xff09;&#xff0c;今天要介绍的是python课程。接下来&#xff0c;小天来详细说明一下&#xff01;19月17日~23日报名《python机器学习实战》即可享受限时330…

那些被.NET大厂拒绝的大佬们,究竟弱在哪里?

如火如荼的金三银四跳槽季迎来尾声&#xff0c;几家欢喜几家愁&#xff0c;既看到腾讯阿里百度的大厂offer&#xff0c;又羡慕30k、40k、50k的高薪&#xff0c;更多其实还是各种面试失蹄的故事。成功的案例五花八门&#xff0c;而失败的原因却千篇一律。据统计&#xff0c;约70…

在python中strip_python中strip()函数怎么用?

python中strip()函数怎么用&#xff1f;发布时间&#xff1a;2020-05-19 16:57:38来源&#xff1a;亿速云阅读&#xff1a;182作者&#xff1a;Leah今天小编为大家分享的是python中strip()函数的使用方法。代码详细容易理解&#xff0c;为此分享给大家做个参考。一起跟随小编过…

ObjectiveC 深浅拷贝学习

&#xff08;转自 http://woshao.com/article/f91898b24a1211e097d3000c2959fd2a/&#xff09; 在ObjC中&#xff0c;什么是深浅拷贝&#xff1f;深浅拷贝分别指深拷贝和浅拷贝&#xff0c;即mutableCopy和copy方法。copy复制一个不可变对象&#xff0c;而mutableCopy复制一个m…

SQL语言最佳实践

为单位制订的SQL规范&#xff0c;分享一下。首先说一下&#xff0c;这是公司用的一个规范&#xff0c;给到程序员做参考的。其实&#xff0c;这个规范是建立在对SQL有一定熟悉程序的基础上的&#xff0c;所以规范本身并不涉及SQL语法学习的相关内容。1. 绝对避免使用 SELECT *S…

有哪些经济学理论可以用在谈恋爱上?

全世界有3.14 % 的人已经关注了数据与算法之美大概两周前回加拿大的航班上&#xff0c;我在机舱尾部跟一位空姐聊了很久。大概两周前回加拿大的航班上&#xff0c;我在机舱尾部跟一位空姐聊了很久。看到浮标沉下去了&#xff0c;我却把鱼竿放回地上&#xff0c;难道我是素食主义…

python 局部变量 占内存吗_Python中全局变量和局部变量的理解与区别

前言学过编程的人应该对全局变量与局部变量这两个名词并不陌生&#xff0c;Python也同多数编程语言一样&#xff0c;也有全局变量与局部变量的概念但是与其他编程语言又有所不同全局变量与局部变量两者的本质区别就是在于作用域用通俗的话来理解的话&#xff0c;全局变量是在整…

port wifi to ICS(4.0.3)

去年移植了2.2。最近又刚刚移植了4.0.3。使用的是broadcom的bcm4329网卡。现把移植经历分享一下 1.该android.hardware.wifi.xml复制到out目录下 在相应的.mk文件中。添加 PRODUCT_COPY_FILES \ frameworks/base/data/etc/android.hardware.wifi.xml:$(PRODUCT_OUT)system/etc…

C# 离线使用nuget

正常在我们使用nuget进行程序集下载的时候&#xff0c;直接在vs编辑器中直接进行操作&#xff0c;下载自己想要的各种程序&#xff0c;但是某些时候&#xff0c;在进行一些办公时&#xff0c;公司要求本机编码不能进行联网操作&#xff0c;那么这种情况下我们怎么进行nuget程序…