RocksDB介绍:一个比LevelDB更彪悍的引擎

关于LevelDB的资料网上还是比较丰富的,如果你尚未听说过LevelDB,那请稍微预习一下,因为RocksDB实际上是在LevelDB之上做的改进。本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的看法,更详细的信息读者可参考其官网:http://rocksdb.org/

RocksDB是在LevelDB原来的代码上进行改进完善的,所以在用法上与LevelDB非常的相似。如下,就是简单的把原来Leveldb信息替换为Rocksdb,从继承的角度看,Rocksdb就像是Leveldb的后辈。

RocksDB:

#include "rocksdb/db.h"
 
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
 
rocksdb::Status status = rocksdb::DB::Open(options,"/tmp/testdb",&db);
 
assert(status.ok());
 
status = db->Get(rocksdb::ReadOptions(),key1,&value);
status = db->Put(rocksdb::WriteOptions(),key2,value);
status = db->Delete(rocksdb::WriteOptions(),key1);
 
delete db;
 


RocksDB虽然在代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。在云计算横行的年代,开口不离Hadoop,RocksDB也开始支持HDFS,允许从HDFS读取数据。而LevelDB则是一个比较单一的存储引擎,有点我就是我,除了我依然只有我的感觉。也是因为LevelDB的单一性,在做具体的应用的时候一般需要对其作进一步扩展。

RocksDB支持一次获取多个K-V,还支持Key范围查找。LevelDB只能获取单个Key

RocksDB除了简单的Put、Delete操作,还提供了一个Merge操作,说是为了对多个Put操作进行合并。站在引擎实现者的角度来看,相比其带来的价值,其实现的成本要昂贵很多。个人觉得有时过于追求完美不见得是好事,据笔者所测(包括测试自己编写的引擎),性能的瓶颈其实主要在合并上,多一次少一次Put对性能的影响并无大碍。

RocksDB提供一些方便的工具,这些工具包含解析sst文件中的K-V记录、解析MANIFEST文件内容等。有了这些工具,就不用再像使用LevelDB那样,只能在程序中才能知道sst文件K-V的具体信息了。

RocksDB支持多线程合并,而LevelDB是单线程合并的。LSM型的数据结构,最大的性能问题就出现在其合并的时间损耗上,在多cpu的环境下,多线程合并那是LevelDB所无法比拟的。不过据其官网上的介绍,似乎多线程合并还只是针对那些与下一层没有Key重叠的文件,只是简单的rename而已,至于在真正数据上的合并方面是否也有用到多线程,就只能看代码了。

RocksDB增加了合并时过滤器,对一些不再符合条件的K-V进行丢弃,如根据K-V的有效期进行过滤。

压缩方面RocksDB可采用多种压缩算法,除了LevelDB用的snappy,还有zlib、bzip2。LevelDB里面按数据的压缩率(压缩后低于75%)判断是否对数据进行压缩存储,而RocksDB典型的做法是Level 0-2不压缩,最后一层使用zlib,而其它各层采用snappy。

在故障方面,RocksDB支持增量备份和全量备份,允许将已删除的数据备份到指定的目录,供后续恢复。

RocksDB支持在单个进程中启用多个实例,而LevelDB只允许单个实例。

RocksDB支持管道式的Memtable,也就说允许根据需要开辟多个Memtable,以解决Put与Compact速度差异的性能瓶颈问题。在LevelDB里面因为只有一个Memtable,如果Memtable满了却还来不及持久化,这个时候LevelDB将会减缓Put操作,导致整体性能下降。笔者目前写的引擎在这方面竟然跟RocksDB不谋而合,这里偷偷乐一下,呵呵。

看完上面这些介绍,相比LevelDB是不是觉得RocksDB彪悍的不可思议,很多该有的地方都有,该想的都想到了,简直不像在做引擎库,更像是在做产品。不过虽然RocksDB在性能上提升了不少,但在文件存储格式上跟LevelDB还是没什么变化的, 稍微有点更新的只是RocksDB对原来LevelDB中sst文件预留下来的MetaBlock进行了具体利用。

个人觉得RocksDB尚未解决的地方:

  1. 依然是完全依赖于MANIFEST,一当该文件丢失,则整个数据库基本废掉。
  2. 合并上依然是整个文件载入,一些没用的Value将被多次的读入内存,如果这些Value很大的话,那没必要的内存占用将是一个可观的成本。

关于这两个问题,尤其是后面那个问题,笔者已有相应的解决方案,至于结果如何只等日后实现之后再作解说了。


转自:http://tech.uc.cn/?p=2592

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


校园网上订餐系统系统主要功能模块包括公告内容(公告栏、轮播图)用户管理(管理员、普通用户)、内容模块(资讯分类、资讯列表)、模块管理(菜品分类、菜单、订单表),采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用SSM框架、Java技术、Ajax技术进行业务系统的编码及其开发,实现了本系统的全部功能。本次报告,首先分析了研究的背景、作用、意义,为研究工作的合理性打下了基础。
从今天开始,正式进入项目阶段。本次的项目是跟着黑马的瑞吉外卖项目走的,有借鉴和使用,也有自己的观点和实现。由于本课程用到了很多前端知识(了解),所以关于前端分析的时候,我应该会选择跳过或者简略一看;大家学有余力或者对前端已经轻车熟路的可以自己看看黑马的视频。本次的项目并没有从前端到后台都自己进行搭建,虽然我也很向往这个,但是还是在学精后端再去深入前端吧,我也没有余力,只是后端的内容就已经让我头大了。
在可预见的将来,IT不会萎缩,只会越发展越庞大,最终会渗透到人类社会的每一个角落。在这个过程中会不断地产生新的领域和新的机会,我们则需要在这个风口上抓住机会。从技术层面来说,吃透测试理论和方法,掌握最少一门开发语言,能够熟练使用最少一种自动化、接口或APP测试工具将成为入行的基本要求。从业务层面来说,新兴或热点领域将来带巨大的需求量和丰厚的薪酬,这也要求我们不断的了解新的领域、学习新的知识
vulntarget-b靶场最详细通关记录。
MongoDB是一个开源、高性能、支持海量数据存储的。
【NoSQL数据库技术与应用】课本代码、课后答案(持续更新)
MongoDB 的安装详细过程
Redisredis 简介redis 采用的是单线程的 KV 模型,由 C 语言编写,1. Redis 中的事务?2. Redis 中的数据结构3. Redis 中如何保证缓存和数据库双写时的数据一致性?4. 如何使用 Redis 做异步队列和延时队列?5. Redis 中的过期策略6. Redis 中的内存淘汰机制7. Redis 中的缓存击穿,缓存穿透,缓存雪崩8. Redis 中的分布式锁9. Redis和memcache的区别10. Redis 中的持久化机制11. Red
Redis必背面试题
1. Truncate 操作:DynamoDB不支持 Truncate操作,最简单的办法是删表重建即可;如果需要删掉一部分数据,可以写脚本用scan 查出 PK 的列表逐个进行删除;还可以设置表的过期时间,让这批数据定期失效即可。2. JavaScript 有两个类库:一种使用了 DynamoDB Json其中包括了数据的类型,需要调用相关的marshal 和 unmarshal方法来转换成标准的 Json3.批量操作:DynamoDB 中批量操作有25 的数据量。
大数据技术原理与应用实验3——NoSQL和关系数据库的操作比较(1)理解四种数据库(MySQL、HBase、Redis和MongoDB)的概念以及不同点;(2)熟练使用四种数据库操作常用的Shell命令;(3)熟悉四种数据库操作常用的Java API。
MongoDB导出数据
TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。
运行开抢.py后会获得taobao_cookies.txt中的Cookie进行自动登录,然后直接进入购物车界面,自动点击结算,到这一步后会根据自己设置的抢购时间进行等待,时间一到立即点击提交订单。本次代码实现的功能是抢某宝的商品,需要先将商品加入购物车,然后根据用户输入的开抢时间进行任务等待,时间一到,立即开抢!我现在在飞速的敲着文字,本来想着今晚简简单单买个东西就好,结果一看某宝,发现我想买的衣服有0元抢购的活动!:先设置好默认收货地址,然后将商品加入购物车!不管你信不信,这就是俺刚瞧出的代码!
通俗来讲,白帽子是指从事正当行业的黑客,他们相当于黑帽与白帽,也就是对网络有很深的了解,并且不骚扰别人。至于灰帽子,是介于白黑之间,亦称灰帽黑客、灰帽子黑客,是指那些懂得技术防御原理,并且有实力突破这些防御的黑客——虽然一般情况下他们不会这样去做。与白帽和黑帽不同的是,尽管他们的技术实力往往要超过绝大部分白帽和黑帽,但灰帽通常并不受雇于那些大型企业,他们往往将黑客行为作为一种业余爱好或者是义务来做,希望通过他们的黑客行为来警告一些网络或者系统漏洞,以达到警示别人的目的,因此,他们的行为没有任何恶意。
就网友提问说想带学生开发一个操作系统说下我的个人的一些看法...
做过大数据抓取的程序员应该都知道,正常市面上的爬虫ip只分为两种,一种是API提取式的,还有一种是账密形式隧道模式的。对于初学者觉得没有必要,我们知道每个卖爬虫ip的网站有的提供了免费IP,可是又很少,写了个爬虫ip池。4,定时检查数据库1和数据库2的爬虫ip数量,以及是否可用。3,在数据库1中拿出少量爬虫ip存入数据库2(方便维护)。3,在数据库1中拿出少量爬虫ip存入数据库2(方便维护)2,检查ip可用 可用存入数据库1,和2。2,检查ip可用 可用存入数据库1和2。1,在各大网站爬取免费爬虫ip。
的个人空间_哔哩哔哩_Bilibili哔哩哔哩Bilibili,你感兴趣的视频都在B站。近期很火的《点燃我,温暖你》很火,里面的爱心代码也很惊艳,但是程序员看了觉得尬的扣脚,网上也有他其他的语言爱心源码,但都不是C语言的,用语言描述一下,就是好多爱心,然后从内到外,从小到大的显示。今天就给大家分享:爱心代码,边看边用!C语言程序的编写就像同将一头大象放到冰箱里。1、打开冰箱2、放入大象3、关上冰箱首先就是计算坐标,更新坐标,绘制爱心三步。重复调用,就可以实现。
接口要获取参数路経中参数必须使用注 @PathVariable ,目的是让 springmvc 参数解析器从路径中解析出参数并进行赋值。方案2:使用参数路怪方式比如:/ employees /{ id }将请求参数作为路径一部分,进打 url 区分。客户端访问 http://Localhost:80/employees/1 1就是 id 参数值。参数路径:/ employees /( id } 其中{ id }参数占位符。方案1:使用多级路経方式比如:/ employees / detail。