一、三者之间的区别

  1. Redis 是一个服务,独立的进程,用户的程序需要与它建立连接才能向它发请求,读写数据。
  2. RocksDB 和LevelDB 是一个库,嵌入在用户的程序中,用户程序直接调用接口读写数据。
  3. Redis 是一个远程内存数据存储(类似于 memcached)。它是一个服务器。单个 Redis 实例非常高效,但完全不可扩展(就 CPU 而言)。 Redis 集群是可扩展的(就 CPU 而言)。RocksDB 是一个嵌入式键/值存储(类似于 BerkeleyDB 或更确切地说是 LevelDB)。它是一个库,支持多线程和基于日志结构合并树的持久性。
  4. 总的来说,Redis 比 RocksDB 具有更多的功能。它可以原生地理解复杂数据结构的语义,例如列表和数组。
  5. 相比之下,RocksDB 将存储的值视为一团数据。如果您想进行任何进一步的处理,您需要将数据带到您的程序中并在那里进行处理(换句话说,您不能将处理委托给数据库引擎(又名 RocksDB))。RocksDB 仅在单个服务器上运行。
  6. Redis有一个集群版本(虽然它不是免费的)Redis 是为内存计算而构建的,虽然它也支持将数据备份到持久存储,但主要用例是内存用例。
  7. 相比之下,RocksDB 通常用于持久化数据,并且在大多数情况下将数据存储在持久性介质上。RocksDB 有更好的多线程支持(特别是对于读——写仍然受到并发访问的影响)。

二、LevelDB的数据结构及读写流程

LevelDB的数据是存储在磁盘上的,采用LSM-Tree的结构实现。LSM-Tree将磁盘的随机写转化为顺序写,从而大大提高了写速度。为了做到这一点LSM-Tree的思路是将索引树结构拆成一大一小两颗树,较小的一个常驻内存,较大的一个持久化到磁盘,他们共同维护一个有序的key空间。写入操作会首先操作内存中的树,随着内存中树的不断变大,会触发与磁盘中树的归并操作,而归并操作本身仅有顺序写。

具体到代码实现上,LevelDB有几个重要的角色,包括对应于上文提到的内存数据的Memtable,分层数据存储的SST文件,版本控制的Manifest、Current文件,以及写Memtable前的WAL。这里简单介绍各个组件的作用和在整个结构中的位置,更详细的介绍将在之后的博客中进行。

  • Memtable:内存数据结构,跳表实现,新的数据会首先写入这里;
  • Log文件:写Memtable前会先写Log文件,Log通过append的方式顺序写入。Log的存在使得机器宕机导致的内存数据丢失得以恢复;
  • Immutable Memtable:达到Memtable设置的容量上限后,Memtable会变为Immutable为之后向SST文件的归并做准备,顾名思义,Immutable Mumtable不再接受用户写入,同时会有新的Memtable生成;
  • SST文件:磁盘数据存储文件。分为Level 0到Level N多层,每一层包含多个SST文件;单层SST文件总量随层次增加成倍增长;文件内数据有序;其中Level0的SST文件由Immutable直接Dump产生,其他Level的SST文件由其上一层的文件和本层文件归并产生;SST文件在归并过程中顺序写生成,生成后仅可能在之后的归并中被删除,而不会有任何的修改操作。
  • Manifest文件: Manifest文件中记录SST文件在不同Level的分布,单个SST文件的最大最小key,以及其他一些LevelDB需要的元信息。
  • Current文件: 从上面的介绍可以看出,LevelDB启动时的首要任务就是找到当前的Manifest,而Manifest可能有多个。Current文件简单的记录了当前Manifest的文件名,从而让这个过程变得非常简单。

http://catkang.github.io/2017/01/07/leveldb-summary.html

三、RocksDB的读写流程

rocksDB的流程与levelDB类似

https://blog.csdn.net/penriver/article/details/117473761