Redis 与 RocksDB
Redis vs RocksDB
我读过 Redis 和 RocksDB,我不明白 Redis 比 RocksDB 有什么优势。
我知道Redis是全内存的,RocksDB是内存的,用的是闪存。如果所有数据都适合内存,我应该选择哪一个?他们有相同的表现吗? Redis 随 CPU 的数量线性扩展?我想还有其他我不了解的差异。
我有一个适合内存的数据集,我打算选择 Redis,但 RocksDB 似乎为我提供了同样的东西,如果有一天数据集增长太多,我就不必担心内存了.
他们没有任何共同点。您正在尝试比较这里的苹果和橘子。
Redis 是一个远程 内存数据存储(类似于 memcached)。它是一个服务器。单个 Redis 实例非常高效,但完全不可扩展(关于 CPU)。 Redis 集群是可扩展的(关于 CPU)。
RocksDB 是一个嵌入式 key/value 存储(类似于 BerkeleyDB 或更准确地说是 LevelDB)。它是一个库,支持多线程和基于日志结构合并树的持久化。
虽然 Didier Spezia 对这两个项目的区分是正确的,但它们 由一个名为 LedisDB 的项目链接。 LedisDB 是一个用 Go 编写的抽象层,它在像 RocksDB 这样的存储引擎之上实现了 Redis API 的大部分功能。在许多情况下,您可以直接将相同的 Redis 客户端库与 LedisDB 一起使用,这使得它在某些情况下几乎可以替代 Redis。 Redis 显然更快,但正如 OP 在他的问题中提到的那样,使用 RocksDB 的主要好处是您的数据集不受可用内存量的限制。我发现这很有用,不是因为我正在处理超大数据集,而是因为 RAM 很昂贵,而且您可以从较小的虚拟服务器中获得更多的里程数。
@Guille 如果您知道热数据的行为(频繁获取)是基于时间戳的,那么 Rocksdb 将是一个明智的选择,但请使用 bloom-filters 优化它以进行回退。如果您的热数据是随机的,然后选择 Redis。在像 Rocksdb 这样的日志结构数据库中,通常不推荐完全在内存中使用 rocksDB,并且它专门针对 SSD 和闪存存储进行了优化。所以我的建议是了解用例并为该特定用例选择一个数据库。
- 总的来说,Redis 比 RocksDB 有更多的功能。它可以自然地理解复杂数据结构(如列表和数组)的语义。相比之下,RocksDB 将存储的值视为数据块。如果你想做任何进一步的处理,你需要将数据带到你的程序并在那里处理它(换句话说,你不能将处理委托给数据库引擎,也就是 RocksDB)。
- RocksDB 仅在单个服务器上运行。 Redis 有集群版本(虽然不是免费的)
- Redis 是为内存计算而构建的,虽然它也支持将数据备份到持久存储,但主要用例是内存用例。相比之下,RocksDB 通常用于持久化数据,并且在大多数情况下将数据存储在持久性介质上。
- RocksDB 有更好的多线程支持(特别是对于读取——写入仍然受到并发访问的影响)。
许多 memcached 服务器使用 Redis(其中使用的协议是 memcached,但底层服务器是 Redis)。这并没有使用 Redis 的大部分功能,但在一个案例中,Redis 和 RocksDB 的功能相似(作为 KVS,尽管仍然处于不同的上下文中,其中基于 Redis 的 memcached 是缓存,而 RocksDB 是数据库,尽管不是企业级数据库)
Redis 是分布式内存数据存储,而 Rocks DB 是嵌入式键值存储而不是分布式。
我读过 Redis 和 RocksDB,我不明白 Redis 比 RocksDB 有什么优势。
我知道Redis是全内存的,RocksDB是内存的,用的是闪存。如果所有数据都适合内存,我应该选择哪一个?他们有相同的表现吗? Redis 随 CPU 的数量线性扩展?我想还有其他我不了解的差异。
我有一个适合内存的数据集,我打算选择 Redis,但 RocksDB 似乎为我提供了同样的东西,如果有一天数据集增长太多,我就不必担心内存了.
他们没有任何共同点。您正在尝试比较这里的苹果和橘子。
Redis 是一个远程 内存数据存储(类似于 memcached)。它是一个服务器。单个 Redis 实例非常高效,但完全不可扩展(关于 CPU)。 Redis 集群是可扩展的(关于 CPU)。
RocksDB 是一个嵌入式 key/value 存储(类似于 BerkeleyDB 或更准确地说是 LevelDB)。它是一个库,支持多线程和基于日志结构合并树的持久化。
虽然 Didier Spezia 对这两个项目的区分是正确的,但它们 由一个名为 LedisDB 的项目链接。 LedisDB 是一个用 Go 编写的抽象层,它在像 RocksDB 这样的存储引擎之上实现了 Redis API 的大部分功能。在许多情况下,您可以直接将相同的 Redis 客户端库与 LedisDB 一起使用,这使得它在某些情况下几乎可以替代 Redis。 Redis 显然更快,但正如 OP 在他的问题中提到的那样,使用 RocksDB 的主要好处是您的数据集不受可用内存量的限制。我发现这很有用,不是因为我正在处理超大数据集,而是因为 RAM 很昂贵,而且您可以从较小的虚拟服务器中获得更多的里程数。
@Guille 如果您知道热数据的行为(频繁获取)是基于时间戳的,那么 Rocksdb 将是一个明智的选择,但请使用 bloom-filters 优化它以进行回退。如果您的热数据是随机的,然后选择 Redis。在像 Rocksdb 这样的日志结构数据库中,通常不推荐完全在内存中使用 rocksDB,并且它专门针对 SSD 和闪存存储进行了优化。所以我的建议是了解用例并为该特定用例选择一个数据库。
- 总的来说,Redis 比 RocksDB 有更多的功能。它可以自然地理解复杂数据结构(如列表和数组)的语义。相比之下,RocksDB 将存储的值视为数据块。如果你想做任何进一步的处理,你需要将数据带到你的程序并在那里处理它(换句话说,你不能将处理委托给数据库引擎,也就是 RocksDB)。
- RocksDB 仅在单个服务器上运行。 Redis 有集群版本(虽然不是免费的)
- Redis 是为内存计算而构建的,虽然它也支持将数据备份到持久存储,但主要用例是内存用例。相比之下,RocksDB 通常用于持久化数据,并且在大多数情况下将数据存储在持久性介质上。
- RocksDB 有更好的多线程支持(特别是对于读取——写入仍然受到并发访问的影响)。
许多 memcached 服务器使用 Redis(其中使用的协议是 memcached,但底层服务器是 Redis)。这并没有使用 Redis 的大部分功能,但在一个案例中,Redis 和 RocksDB 的功能相似(作为 KVS,尽管仍然处于不同的上下文中,其中基于 Redis 的 memcached 是缓存,而 RocksDB 是数据库,尽管不是企业级数据库)
Redis 是分布式内存数据存储,而 Rocks DB 是嵌入式键值存储而不是分布式。