Redis 与 RocksDB

问题描述 投票:0回答:6

我读过有关 Redis 和 RocksDB 的内容,但我不明白 Redis 相对于 RocksDB 的优势。

我知道Redis都是内存中的,RocksDB是内存中的并且使用闪存存储。如果所有数据都适合内存,我应该选择哪一个?他们有同样的表现吗? Redis 随 CPU 数量线性扩展?我想还有其他我不明白的差异。

我有一个适合内存的数据集,我本来打算选择 Redis,但似乎 RocksDB 为我提供了相同的功能,如果有一天数据集增长太多,我不必担心内存。

redis rocksdb
6个回答
118
投票

他们没有任何共同点。您正在尝试在这里比较苹果和橙子。

Redis 是一个远程内存数据存储(类似于 memcached)。它是一个服务器。单个 Redis 实例非常高效,但完全不可扩展(就 CPU 而言)。 Redis 集群是可扩展的(就 CPU 而言)。

RocksDB 是一个嵌入式键/值存储(类似于 BerkeleyDB 或更确切地说 LevelDB)。它是一个库,支持多线程和基于日志结构合并树的持久性。


35
投票

虽然 Didier Spezia 的答案在区分这两个项目方面是正确的,但它们由一个名为 LedisDB 的项目链接在一起。 LedisDB 是一个用 Go 编写的抽象层,它在 RocksDB 等存储引擎之上实现了大部分 Redis API。在许多情况下,您可以直接将相同的 Redis 客户端库与 LedisDB 一起使用,这使得它在某些情况下几乎可以替代 Redis。 Redis 显然更快,但正如 OP 在他的问题中提到的,使用 RocksDB 的主要好处是你的数据集不受可用内存量的限制。我发现这很有用,不是因为我正在处理超大型数据集,而是因为 RAM 很昂贵,并且您可以从较小的虚拟服务器中获得更多里程。


17
投票
  1. 总的来说,Redis 的功能比 RocksDB 更多。它可以自然地理解复杂数据结构(例如列表和数组)的语义。相反,RocksDB 将存储的值视为数据块。如果您想进行任何进一步的处理,您需要将数据带到您的程序中并在那里进行处理(换句话说,您不能将处理委托给数据库引擎(又名 RocksDB)。
  2. RocksDB 仅运行在单个服务器上。 Redis 有集群版本(虽然不是免费的)
  3. Redis 是为内存计算而构建的,虽然它也支持将数据备份到持久存储,但主要用例是在内存用例中。相比之下,RocksDB 通常用于持久数据,并且在大多数情况下将数据存储在持久介质上。
  4. RocksDB 具有更好的多线程支持(特别是对于读取——写入仍然受到并发访问的影响)。

许多memcached服务器使用Redis(其中使用的协议是memcached,但底层服务器是Redis)。这并没有使用 Redis 的大部分功能,但这是 Redis 和 RocksDB 功能相似的一种情况(作为 KVS,尽管仍然处于不同的上下文中,其中基于 Redis 的 memcached 是一个缓存,而 RocksDB 是一个数据库,尽管不是企业级数据库)


7
投票

两者都是键值存储,所以它们有一些共同点

正如其他人提到的,RocksDB 是嵌入式的(作为一个库),而 Redis 是一个独立的服务器。而且,Redis 可以分片。

RocksDB Redis
保留在磁盘上 存储在内存中
严格可序列化 最终一致
分类收藏 无排序
垂直缩放 水平缩放

如果您不需要水平扩展,RocksDB通常是一个更好的选择。有些人会认为内存存储会比持久存储更快,但事实并非总是如此。嵌入式存储不存在网络瓶颈,这在实践中非常重要,特别是对于大型机器上的垂直扩展。

如果您需要通过网络提供 RocksDB 服务器或需要高级语言绑定,最有效的方法是使用 project UStore。但是,它还支持其他嵌入式存储作为引擎,并提供更高级别的功能,例如类似于 RedisGraph 的图形集合,以及类似于 RedisJSON 的文档集合。


5
投票

@Guille 如果您知道热数据的行为(频繁获取)是基于时间戳的,那么 Rocksdb 将是一个明智的选择,但请使用布隆过滤器对其进行优化以进行回退。如果您的热数据是随机的,那么请选择Redis。在像 Rocksdb 这样的日志结构数据库中,一般不建议完全在内存中使用rocksDB,并且它专门针对 SSD 和闪存存储进行了优化。因此,我的建议是了解用例并为该特定用例选择一个数据库。


3
投票

Redis 是分布式内存数据存储,而 Rocks DB 是嵌入式键值存储而不是分布式。

© www.soinside.com 2019 - 2024. All rights reserved.