Redis与RocksDB比较

54

我了解Redis和RocksDB,但不确定Redis相对于RocksDB的优势在哪里。

我知道Redis全部运行在内存中,而RocksDB是内存和闪存混合使用。如果所有数据都可以放进内存,那么应该选择哪个?它们的性能是否相同?Redis能够根据CPU数量线性扩展吗?我想还有其他一些区别我没有理解。

我的数据集适合放在内存中,我原本想选择Redis,但现在看来RocksDB也能提供类似的功能,而且如果有一天数据集变得太大,我也不必担心内存问题。

6个回答

114

他们没有共同点。你试图在这里比较不同的事物。

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

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


3
谢谢,我猜想RocksDB会更快一些,因为它是嵌入式的;而Redis则在需要许多应用程序访问内存数据库时更常用。我不知道RocksDB是一个嵌入式键/值存储。 - Guille
2
抱歉我的无知,但是您所说的“嵌入式键值存储”,是指它只在单台计算机上运行吗?基本上是本地数据库吗? - speedplane
13
它只能在本地计算机以及本地进程中运行。它是一个库,而不是服务器。 - Didier Spezia
使用MyRocks可以创建一个带有MySQL协议的“服务器”RocksDB。 - user2559936
1
虽然它们不同,但实际上它们也是兼容的。请查看Redis on Flash项目,该项目使用RocksDB将数据溢出到磁盘上。https://redislabs.com/redis-enterprise/technology/redis-on-flash/ - nday

33

虽然 Didier Spezia 给出的区分 Redis 和 RocksDB 的答案是正确的,但它们通过名为 LedisDB 的项目进行了关联。 LedisDB 是用 Go 编写的抽象层,在存储引擎(如 RocksDB)之上实现了大部分 Redis API。在许多情况下,您可以直接使用相同的 Redis 客户端库与 LedisDB 一起使用,使其成为某些情况下几乎可以替代 Redis 的选择。Redis 显然更快,但正如 OP 在他的问题中提到的那样,使用 RocksDB 的主要好处在于数据集不受可用内存的限制。我发现这非常有用,不是因为我正在处理超级大型数据集,而是因为 RAM 很昂贵,您可以从更小的虚拟服务器中获得更多的效益。


5
Redis并不明显地比RocksDB更快,事实上相反的情况更为确切。RocksDB旨在更快地运行,因为它是一种嵌入式数据库,附带库而非需要连接的服务器。 - Pawel

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是一个数据库,尽管不是企业级的)。


6

两者都是键值存储,因此它们有共同之处

正如其他人所提到的,RocksDB是作为库嵌入式的,而Redis是一个独立的服务器。此外,Redis可以进行分片。

RocksDB Redis
持久化在磁盘上 存储在内存中
严格可序列化 最终一致性
排序集合 无排序
垂直扩展 水平扩展

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

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


我真的比起被接受的答案更喜欢这个回答。 - RamPrakash

4

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


3

Redis是一个分布式的内存数据存储,而Rocks DB是一个嵌入式的键值存储,不具备分布式特性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接