我了解Redis和RocksDB,但不确定Redis相对于RocksDB的优势在哪里。
我知道Redis全部运行在内存中,而RocksDB是内存和闪存混合使用。如果所有数据都可以放进内存,那么应该选择哪个?它们的性能是否相同?Redis能够根据CPU数量线性扩展吗?我想还有其他一些区别我没有理解。
我的数据集适合放在内存中,我原本想选择Redis,但现在看来RocksDB也能提供类似的功能,而且如果有一天数据集变得太大,我也不必担心内存问题。
他们没有共同点。你试图在这里比较不同的事物。
Redis是一种远程内存数据存储(类似于memcached)。它是一个服务器。一个单独的Redis实例非常高效,但完全不可扩展(关于CPU)。一个Redis集群是可扩展的(关于CPU)。
RocksDB是一种嵌入式键/值存储(类似于BerkeleyDB或更准确地说是LevelDB)。它是一个库,支持多线程和基于日志结构化合并树的持久性。
虽然 Didier Spezia 给出的区分 Redis 和 RocksDB 的答案是正确的,但它们通过名为 LedisDB 的项目进行了关联。 LedisDB 是用 Go 编写的抽象层,在存储引擎(如 RocksDB)之上实现了大部分 Redis API。在许多情况下,您可以直接使用相同的 Redis 客户端库与 LedisDB 一起使用,使其成为某些情况下几乎可以替代 Redis 的选择。Redis 显然更快,但正如 OP 在他的问题中提到的那样,使用 RocksDB 的主要好处在于数据集不受可用内存的限制。我发现这非常有用,不是因为我正在处理超级大型数据集,而是因为 RAM 很昂贵,您可以从更小的虚拟服务器中获得更多的效益。
许多memcached服务器使用Redis(其中使用的协议是memcached,但底层服务器是Redis)。这并没有使用Redis的大部分功能,但是这是Redis和RocksDB都类似地发挥作用的一个案例(作为KVS,尽管在不同的上下文中,基于Redis的memcached是一个缓存,但RocksDB是一个数据库,尽管不是企业级的)。
两者都是键值存储,因此它们有共同之处。
正如其他人所提到的,RocksDB是作为库嵌入式的,而Redis是一个独立的服务器。此外,Redis可以进行分片。
RocksDB | Redis |
---|---|
持久化在磁盘上 | 存储在内存中 |
严格可序列化 | 最终一致性 |
排序集合 | 无排序 |
垂直扩展 | 水平扩展 |
如果您不需要水平扩展,则RocksDB通常是更好的选择。有些人会认为内存存储比持久存储严格更快,但这并不总是正确的。嵌入式存储没有网络瓶颈,在实践中非常重要,特别是对于在更大的机器上进行垂直扩展。
如果您需要通过网络提供RocksDB服务或需要高级语言绑定,最有效的方法是使用UKV项目。它还支持其他嵌入式存储引擎,并提供更高级别的功能,例如类似于RedisGraph的图形集合和类似于RedisJSON的文档集合。
@Guille如果您知道热数据(经常获取)的行为是基于时间戳的,那么Rocksdb将是一个明智的选择,但要使用布隆过滤器进行回退优化。如果您的热数据是随机的,则选择Redis。在类似Rocksdb这样的日志结构数据库中,完全将RocksDB用于内存通常不被推荐,并且其专门针对SSD和闪存存储进行了优化。因此,我的建议是了解用例并选择适合该特定用例的数据库。
Redis是一个分布式的内存数据存储,而Rocks DB是一个嵌入式的键值存储,不具备分布式特性。