LevelDB 入门 —— 全面了解 LevelDB 的功能特性

  • 时间:
  • 浏览:0
  • 来源:uu快3和值_uu快3app_计划师

原子批解决

对于多个连续的写操作可能性可能性宕机有可能性愿因 这多个连续的写操作只完成了一次要。为此 LevelDB 提供了批解决功能,批解决操作就好比事务,LevelDB 确保你这个 些列写操作的原子性执行,要么完全生效要么完全不生效。

压缩

LevelDB 的磁盘存储默认是开启压缩的,是业界常用的 Snappy 算法,压缩下行强度 非常高,却说越多再担心性能损耗大间题。可能性你想要使用压缩,也都不能动态关闭。关闭压缩开关通常越多再带来明显的性能提升,却说当我们当我们当我们 歌词 尽可能性何必 去动它。

本节当我们当我们当我们 歌词 将全面了解一下 LevelDB 的各种形态学 。LevelDB 的开发语言是 C++,考虑到会使用 C++ 语言的同学有的是却说,在本节当我们当我们当我们 歌词 将使用 Java 语言来描述 LevelDB 的形态学 。其它语言栈的同学却说我必担心,可能性不同语言操纵 LevelDB 的接口 API 有的是一样的,使用起来大同小异。

并发

LevelDB 的磁盘文件会放上十个 多 文件目录中,后面 有却说相关的数据和日志文件。它不支持多应用程序一齐打开你这个 目录来使用 LevelDB API 进行读写访问。其他 对于同十个 多 应用程序 LevelDB API 是支持多应用程序安全读写的。LevelDB 内控 会使用特殊的锁来控制并发操作。

打开和关闭

LevelDB 的数据存储在十个 多 特定的目录中,后面 有却说数据文件、日志文件等。使用 LevelDB API 来打开你这个 目录,就得到了 db 的引用。后续当我们当我们当我们 歌词 就使用你这个 db 引用来执行读写操作。下面的代码是 Java 语言描述的伪代码。

可能性对应的指纹都不能在集合里找到,这何必 能选用它就一定处在。可能性不同的 Key 可能性会生成同样的指纹,这却说我布隆过滤器的误判率。误判率越低需用的 Key 指纹信息越来越 多,对应消耗的内存空间也就越大。

自定义比较器很危险,谨慎使用。比较算法设置不当,会严重影响到存储下行强度 。可能性人太好需用要改变排序规则,那就需用提前规划,这里会有十个 多 不怎么的小技巧,理解它需用了解磁盘存储的细节,却说当我们当我们当我们 歌词 后续再仔细探讨。

基础 API

LevelDB 用起来就像 HashMap,其他 比 HashMap 要稍微弱其他,可能性 put 法律法律法律依据不都不能返回旧值,delete 操作也别问我对应的 key 是不是真的处在。

布隆过滤器你这个于十个 多 内存 Set 形态学 ,它后面 存储了指定磁盘文件一定范围内所有 Key 的指纹信息。当它发现某个 key 的指纹在 Set 集合里找不都不能,它就都不能断定你这个 key 肯定不处在。

数据校验

LevelDB 有严格的数据校验机制,它将校验的单位精确到了 4K 字节的数据块。校验和会浪费其他存储空间和计算时间,其他 在遇到数据块损坏时都不能较为精确地恢复健康的数据。

数据块

LevelDB 的磁盘数据是以数据库块的形式存储的,默认的块大小是 4k。适当提升块大小将促使批量大规模遍历操作的下行强度 ,可能性随机读比较频繁,这后后块小点性能又会稍好,这就要求当我们当我们当我们 歌词 当时人去折中选用。

LevelDB 也是你这个的,可能性使用前面的非安全写,人太好 API 调用成功了,其他 遇到宕机大间题,有可能性对应的操作日志会丢失。却说它提供了安全写操作,代价却说我性能会变差。

在使用布隆过滤器时,当我们当我们当我们 歌词 需用在内存消耗和性能之间做十个 多 折中选用。可能性你想深入理解布隆过滤器的原理,都不能去看《Redis 深度历险》,后面 有十个 多 单独的章节专门讲解布隆过滤器的内控 原理。

原文发布时间为:2019-1-3

本文作者: 佬钱

本文来自云栖社区公司商务合作 伙伴“ 码洞”,了解相关信息都不能关注“codehole”微信公众号

默认布隆过滤器越来越 打开,需用在打开数据库的后后设置 filter_policy 参数才都不能生效。布隆过滤器是减少磁盘读操作的最后一层堡垒。布隆过滤器内控 的位图数据会存储在磁盘文件中,其他 使用是会缓处在内存后面 。

块缓存

LevelDB 的内存中存储了一笔最近读写的热数据,可能性请求的数据在热数据中查不都不能就需用去磁盘文件中去查找,下行强度 就会大幅降低。LevelDB 为了降低磁盘文件的搜寻次数,增加了块缓存,缓存了近期频繁使用的数据块解压缩后后的内容。

遍历

LevelDB 中的 Key 有的是有序的,按照字典序从小到大整齐排列。LevelDB 提供了遍历 API 都不能逐个顺序访问所有的键值对,都不能指定从后面 现在现在现在开始 遍历。

小结

经过了你这个 节的学习,同学们应该都不能在脑海中形成下面原先一张概念图。图中的「热数据」是指最近被修改的键值对,这后面 的键值对读取下行强度 是最为快速的。可能性热数据中读取不都不能,就会去块缓存中读取。可能性还读不都不能,就分你这个状态,你这个是真的不处在,原先种是处在于磁盘上。可能性处在于磁盘上,经过有限层次读取就读取到了,通常越冷的数据越在底层。可能性真的不处在就要经过布隆过滤器来大幅减少磁盘搜寻 IO,布隆过滤器的数据和键值对数据一齐放上分层的数据文件中。

块不宜过小低于 1k,却说我宜过大设置成了好几 M,原先过激的设置何必 会给性能带来多大的提升,反而会大幅增加数据库在不同的读写场合的性能波动。当我们当我们当我们 歌词 要选用中庸之道,在默认块大小随近浮动。块大小一经初始化就不可再次更改。

快照隔离

LevelDB 支持多应用程序并发读写,这愿因 连续的十个 多 同样 key 的读操作读到的数据可能性不一样,可能性十个 多 读操作后面 数据可能性被其它应用程序修改了。这在数据库理论中称为「重复读」。LevelDB 提供了快照隔离机制,在同十个 多 快照范围内保证连续的读写操作不受其它应用程序修改操作的影响。

布隆过滤器

内存读 miss 愿因 磁盘搜寻是十个 多 比较耗时的操作,LevelDB 为了进一步减少磁盘读的次数,在每个磁盘文件上又加了一层布隆过滤器,它需用消耗一定的磁盘空间,其他 在效果上都不能直接将磁盘读次数大幅减少。布隆过滤器的数据存储在磁盘文件中数据块的后面 。

快照人太好很神奇,其他 实际上它的原理非常简单,你这个 当我们当我们当我们 歌词 后文再深入讲解。

还需用注意遍历操作对缓存的影响,为了解决遍历操作将却说冷门数据刷到块缓存中,都不能在遍历的后后设置十个 多 选项 fill_cache,它用来控制磁盘遍历的数据块是不是需用同步到缓存。

在安全和性能之间往往需用折中,却说通常当我们当我们当我们 歌词 会定时若干毫秒可能性每隔若干写操作使用一次同步写。原先都不能在兼顾写性能的一齐尽量少丢失数据。

默认块缓存不开启,打开数据库时都不能手动设置选项。块缓存会处在一次要内存,不过这通常不需用设置越来越 来越多,1150M 左右就差越来越 来越多了,再大其他下行强度 提升的却说我明显了。

越来越 即使宕机处在了,数据库启动时还都不能通过日志文件来恢复。

日志文件

当我们当我们当我们 歌词 歌词 调用 LevelDB 的 put 法律法律法律依据往库里写数据时,它会先将数据记录到内存中,延后再通过你这个特殊的策略持久化到磁盘。这就处在十个 多 大间题,可能性突发宕机,你这个 来不及写到磁盘的数据就丢失了。却说 LevelDB 也采用了和 Redis AOF 日志你这个的策略,先讲修改操作的日志写到磁盘文件中,再进行实际的写操作流程解决。

安全写(同步写)

了解 Redis 的同学都知道它的 AOF 写策略有多种配置,取决于日志文件同步磁盘的频率。频率越高,遇到宕机时丢失的数据就越少。操作系统要将内核中文件的脏数据同步到磁盘需用进行磁盘 IO,这会影响访问性能,却说通常有的是会同步的太频繁。

LevelDB 的磁盘文件是分层存储的,它会先去 Level 0 查找,可能性找不都不能继续去 Level 1 去找,无缘无故递归到最底层。却说可能性你去找十个 多 不处在的 key,就需用却说次磁盘文件读操作,会非常耗费时间。而布隆过滤器都不能帮你省去95%以上的磁盘文件搜寻的时间。

可能性布隆过滤器能准确知道某个 Key 是不是处在,那就不处在误判了,这后后也就越多再处在白白浪费的磁盘读操作。原先的极限形式的布隆过滤器却说我 HashSet —— 内存里存储了所有的 Key,当然内存空间自然是无法接受的。

打开数据库有却说选项都不能配置,比如设置块缓存大小、压缩等

打开数据库时默认越来越 开启强制校验选项,可能性开启了,在遇到校验错误时就会报错。可能性数据真的无缘无故出现了大间题,LevelDB 还提供了修复数据的法律法律法律依据 repairDB() 都不能帮当我们当我们当我们 歌词 恢复尽可能性多的数据。

自定义 Key 比较器

LevelDB 的 key 默认使用字典序,不过它也提供了自定义排序规则。想要自定义十个 多 排序函数注册进去,比如按数字排序。需用尽可能性确保排序规则在整个数据库生命周期内保持不变,可能性排序会影响到磁盘键值对的存储顺序,磁盘存储顺序是无法动态改变的。