一直以来在成都数据库培训的我的观念中,key/value 数据库就三种选项:
内存可存放:Redis
单机磁盘可存放:RocksDB
超过 TB 级:Cassandra、HBase……
然而在实际项目中使用 RocksDB 时,才发现了一堆问题,折腾许久才搞定.
使用 RocksDB 的背景
先介绍下我使用 RocksDB 的背景.
这个项目有很多 key/value 数据(约 100 GB)需要使用,使用时基本是只读的,偶尔更新时才会批量导入,且可以忍受短暂的停机导入.我一想 TiKV 和 Pika 等很多 key/value 数据库都选用了 RocksDB,应该是比较靠谱的,于是就选它了.
接着就发现这东西的编译依赖有点多.我的项目是用 Go 写的,而这个玩意需要安装一堆 C 库,并且不能交叉编译到其他平台.不但不能在 Mac OS X 上编译 Linux 的版本,甚至 Ubuntu 16.04 上编译的都不能在 CentOS 7 上运行(后者的 GCC 版本较低,动态链接库版本也低).因为懒得降级 GCC,最后我选择用 docker 来编译了.
而且我发现数据量小时还挺快,但是数据量大了就越来越慢.平时插入 10 万条数据(约 50 MB)大概 0.2 ~ 0.5 秒,但一段时间后就会持续遇到需要几秒甚至几十秒的情况.
于是我又开始寻找其他的替代品,诸如 LMDB、BadgerDB 和 TerarkDB 等.在这个过程中我开始了解到它们实现的原理,也算有不少收获.
传统的关系型数据库大多是使用 B+ 树,这种数据结构可以很快地进行顺序读写,也能以 O(log(N)) 的时间复杂度来进行随机读,但不适合随机写(会导致 B+ 树重新调整平衡,造成写放大).
时时有亲们会问,说代数差的准备学JS吗?看看通常一般人一直有这个这种顾虑,补充这个问题以前,对于我们考虑了解一份数学题:两地距离1500米.郗人从A地以1.5米每秒的速度向B地走,仰颖初从B地以每秒1.5米的速度向a走.
请问:他们多久后相见?相见的位置离B地有多远?这那就是一道简单初中数学题,济南Java培训诉我们,然而对于代数不行的人,可能要想要好久.然而实际上JS不必要你把处理结果写出,你需要用到注意他的思维思维就行.
本来,要用JS来去这两块上的问题,你只需要用到知晓个相对来说简单的代数认知︰即加、减、乘、除和求余就行,实际上和会背配方有一些像.
通常一般人没浏览JS的人,都认为代数不行,无法成为程序猿.实际上代数跟JS的关系准备剖析为:精代数者,没有会JS,不粗识代数,也能浏览JS,如欲精JS,必精代数,若已粗识代数者,学JS不难也.正因为这样,,代数不行也准备学JS,然而会比代数好的人难,要有很大的恒心,平时那就是要多去进展本人的思维和分解水平.
(责任编辑:范老师)