Redis 和 MongoDB 有什么区别?
远程字典服务器(Redis)和 MongoDB 是两个 NoSQL 数据库,以非结构化格式存储数据。NoSQL 数据库与使用表、行和列的关系数据库存储数据的方法不同。Redis 是一个开源的内存数据库,它以键值对的形式存储数据。这种数据库将数据存储在 RAM 中以获得高性能,但也提供了磁盘永久存储作为附加功能。MongoDB 是一种源代码可用的文档数据库,以序列化的 JSON 格式存储数据。MongoDB 将数据存储在外部存储器中,但在企业版中包含内存存储引擎。
数据模型:Redis 与MongoDB
Redis 和 MongoDB 使用不同的数据模型,在架构上以不同的方式存储数据。
Redis
Redis 将数据存储在 RAM 中,因此您可以直接从内存访问数据。尽管这种方式可以提供低延迟的响应,但也限制了可以存储的数据量。Redis 通过快照和仅附加文件(AOF)日志记录将数据集保存到磁盘,从而提供数据持久性。
Redis 将数据存储为键值对,其中每个数据条目都有一个唯一的键。它支持各种数据类型,例如排序集、哈希、集合、列表和字符串。键可以是任意长度,总长度不超过 512MB。
下图显示了 Redis 数据模型。
MongoDB
MongoDB 遵循文档数据模型,主要将数据存储在外部存储器存储中。它将数据存储为序列化的二进制 JSON(BSON)文档。最大文档大小为 16MB。
MongoDB 的架构对于扩展大型数据卷非常有用,因为它可以根据磁盘空间提高容量。企业用户也可以将内存存储引擎用于混合方法。您可以对经常访问的数据使用内存缓存,同时仍然主要依靠磁盘存储来实现持久性。
下图显示了 MongoDB 数据模型。
Redis 和 MongoDB 的相似之处
Redis 和 MongoDB 都是 NoSQL 数据库,具有灵活的架构设计、水平可扩展性和高可用性。此类数据库能够更灵活地存储文档和图像等非结构化数据。与关系数据库不同,它们可以实现不使用架构的动态数据模型。
这两个非关系数据库有多个相似之处。
二级索引
Redis 和 MongoDB 提供二级索引。借助此功能,您可以在非主键字段上创建其他索引。创建这些附加索引后,您可以在搜索不同的条件时更快地查询和检索数据。二级索引提高了这两个 NoSQL 数据库的灵活性和查询性能。
复制
为了提供高可用性和耐久性,MongoDB 和 Redis 可使用复制功能。您可以创建副本集(或集群),其中 NoSQL 数据库跨多个节点复制数据以提供冗余。在这两个数据库中,都有一个接受写入操作的主实例和一个或多个从主实例复制数据的辅助实例。如果主实例出现故障,辅助实例可以接管。
性能
Redis 和 MongoDB 都提供低延迟响应,并且都可以处理高吞吐量的工作负载。Redis 是一个内存数据库,这意味着它将数据存储在内存中。该存储系统使 Redis 可以实现高速读取和写入操作。MongoDB 将内存存储与基于磁盘的存储相结合,进而提供速度和数据持久性。
主要区别:Redis 与MongoDB
Redis 和 MongoDB 在功能和能力上也有差异。以下是两者的一些其他主要区别。
扩展
水平扩展使 MongoDB 能够高效处理大量数据。它使用分片在多个区域和节点之间分配数据。通过交叉分片操作,您可以跨多个分片进行查询和更新。
Redis 提供的可扩展性与 MongoDB 不同。默认情况下,Redis 仅使用单个分片进行主要操作。您必须基于哈希手动维护分片,这会使管理变得更加复杂。Redis 还缺乏跨分片功能。
可用性
MongoDB 和 Redis 都支持通过复制实现可用性。但是,MongoDB 通过使用副本集支持更高的可用性。MongoDB 最多可以创建 50 个数据副本,这些副本分布在多个节点、数据中心甚至地理区域。它支持自动失效转移机制;如果主节点脱机,它会从副本中选出一个新的主节点。
相比之下,Redis 默认不提供自动失效转移。管理员用户启动手动失效转移,尤其是在副本位于其他数据中心时。如果要启动自动失效转移,则必须设置和配置一个名为 Redis Sentinel 的单独组件。
完整性
MongoDB 支持多文档的原子、一致、隔离和持久(ACID)事务。因此,您可以在多个操作中保持数据的一致性。使用多文档事务,可以将多个操作作为一个单元执行。在会话中,MongoDB 可以提交所有更改或将其回滚,这有助于确保 ACID 合规性。
相反,Redis 不提供内置的 ACID 支持。但是,您可以使用 MULTI 命令将多个命令分组为一个原子操作。但仅凭这一操作并不能解决问题。您还需要在应用程序代码中实施回滚功能,因为这并不是 Redis 在事务中原生支持的功能。
查询语言
MongoDB 在查询方面提供了高度的灵活性,甚至可以执行复杂的空间计算和数据分析功能。MongoDB 使用 MongoDB 查询语言(MQL),支持类似 JSON 的语法,可简化高级查询。使用 MQL,您可以对单个或多个键、文本搜索和范围执行高级查询。
相比之下,Redis 针对快速键值访问操作,而不是复杂的查询和搜索功能进行了优化。主要通过提供键并检索相应数据的方式来使用 Redis。Redis 没有像 MQL 这样的查询语言。相反,它提供多种命令来与数据交互。例如,您可以使用 GET 命令通过提供相应的键来检索值。
何时使用 Redis 与MongoDB
对于具有快速查询功能的临时数据存储,请使用 Redis。要长期持久存储具有丰富查询功能的复杂数据,请使用 MongoDB。
Redis 提供对经常访问的数据的快速访问,因此适用于缓存和会话存储。由于该系统内置对发布-订阅(pub/sub)消息传递模式的支持,因此可以在实时应用程序或事件驱动架构中使用。它还提供高级数据结构,例如排序集和列表,可用于实施速率限制、任务队列和作业调度系统。此外,它还能高效地对数据进行计数和汇总,因此非常适合用于跟踪排行榜数据或其他统计数据。
相比之下,MongoDB 可用于大规模存储复杂的应用程序数据。它提供了更传统的数据库结构和不使用架构的存储,因此开发人员可以采取更灵活的方法。它可以高效处理大量写入和读取,并且可以处理大型数据集。您可以将其用于内容管理或大规模管理用户个人资料。 MongoDB 还具有内置的地理空间索引,并且支持空间查询,这使其适用于基于位置的应用程序或带有地理空间组件的数据。
能否将 Redis 和 MongoDB 配合使用?
在许多应用程序中,同时使用 Redis 和 MongoDB 是一种常见的策略。Redis 的速度与 MongoDB 的长期存储能力相辅相成。您可以同时使用 Redis 和 MongoDB 来优化数据库性能,提高可扩展性,并为应用程序提供灵活的系统。
例如,您可以使用 Redis 进行实时数据处理。Redis 非常适合捕获和处理直播流数据,因为它可以处理实时数据处理场景。然后,您可以将使用 Redis 处理的数据或结果存储在 MongoDB 中,用于存档和更复杂的集成分析。
另一个例子是跨 Redis 和 MongoDB 的混合数据模型。您可以同时使用 Redis 的键值存储和 MongoDB 的面向文档的模型。Redis 提供了一个简单的系统来访问您经常访问的元数据,与此同时,您可以使用 MongoDB 来处理更复杂的数据结构。
差异摘要:Redis 与MongoDB
Redis |
MongoDB |
|
数据模型 |
基于键值的内存数据存储。 |
永久性文档数据库。 |
扩展 |
Redis 无法提供同等的可扩展性。 |
通过水平扩展、分片和分区数据,MongoDB 数据库具有高度的可扩展性。 |
可用性 |
您需要一个名为 Redis Sentinel 的单独组件来监控集群的自动失效转移。 |
默认情况下自动进行失效转移。 |
完整性 |
Redis 提供用于创建单个原子操作的命令。必须在应用程序代码中管理回滚。 |
MongoDB 内置了对多文档 ACID 事务和回滚的支持。 |
查询语言 |
Redis 使用命令进行查询。 |
MongoDB 使用 MongoDB 查询语言(MQL)来查询和操作数据。 |
AWS 如何帮助您满足 Redis 和 MongoDB 的需求?
Amazon Web Services(AWS)提供许多产品/服务来支持您使用 Redis 和 MongoDB。
Amazon MemoryDB 是与 Redis 兼容的持久型内存数据库服务,可提供超快性能。它专为使用微服务架构创建的现代化应用程序构建。MemoryDB 使用多可用区事务日志跨多个可用区(AZ)持久存储数据,以实现快速失效转移、数据库恢复和节点重启。您可以实现微秒级读取和个位数毫秒的写入延迟以及高吞吐量。
Amazon ElastiCache 是一项完全托管的缓存服务,可让您轻松地在云中设置、操作和扩展缓存。借助 ElastiCache,您可以通过缓存来自主数据库和数据存储的数据,加快应用程序速度,并释放微秒级读写延迟。
Amazon DocumentDB(与 MongoDB 兼容)是一个完全托管的原生 JSON 文档数据库,可轻松扩展企业工作负载。由于您能够以灵活的 JSON 格式存储、查询、索引和聚合数据,因此可以比以往任何时候都更快地开发和发展应用程序。托管数据库使您无需执行手动数据库管理任务,从而提高工作效率并简化开发。
立即创建账户,开始在 AWS 上使用 Redis 和 MongoDB。