常用 NoSQL 比较
Q: 请根据 CAP 实现程度,分布式实现方式,数据结构,查询方式,存储引擎等比较 mongodb, redis, cassandra, scylladb, dragonflydb, TiKV, couchbase 等 nosql 数据库
A: 对比 NoSQL 数据库时,可以根据以下几个关键维度来分析:CAP 理论实现、分布式架构、数据结构、查询方式、存储引擎等。下面将对 MongoDB、Redis、Cassandra、ScyllaDB、DragonflyDB、TiKV、和 Couchbase 进行逐项比较。
1. CAP 理论实现(Consistency, Availability, Partition Tolerance)
- MongoDB: 作为 CP 系统(优先一致性和分区容忍性),默认配置下提供强一致性。通过副本集实现高可用性,牺牲部分可用性来实现一致性,但可以通过读写策略配置接近 AP 模型(通过允许从次要节点读取以提高可用性)。
- Redis: 在主从模式下更偏向于 AP 模型(优先可用性和分区容忍性),但在主从切换期间可能会导致一致性问题。如果配置为使用 Redis Sentinel 或 Redis Cluster,它可以在一定程度上实现可用性和容忍分区,但一致性较弱。
- Cassandra: 作为 AP 系统,强调可用性和分区容忍性。它使用可调一致性级别(如 Quorum、One 等)来在可用性和一致性之间做权衡。
- ScyllaDB: 也遵循 AP 模型,是 Cassandra 的高性能实现,因此在 CAP 特性上与 Cassandra 类似,强调高可用性和可扩展性。
- DragonflyDB: 类似 Redis,偏向 AP 模型,注重高性能和可用性。主要用于缓存和实时处理,不保证强一致性。
- TiKV: 作为 CP 系统,TiKV 保证强一致性和分区容忍性,通过 Raft 协议实现分布式一致性。可用性可能会在网络分区时受到影响。
- Couchbase: 提供灵活的 CAP 选择,允许根据使用场景选择 CP 或 AP 模型。通常,Couchbase 通过副本与分片来实现分区容忍性,同时提供可调的强一致性或最终一致性。
2. 分布式实现方式
- MongoDB: 采用副本集(Replica Set)和分片(Sharding)机制进行数据分布。副本集用于实现高可用性,分片用于横向扩展和大规模数据的分布式存储。
- Redis: Redis 支持主从复制(Replication)和Redis Cluster(分布式模式)。Redis Cluster 通过分片机制在多个节点之间分布数据。
- Cassandra: Cassandra 使用对等节点架构(Peer-to-Peer),每个节点都相同,无主节点。数据通过一致性哈希进行分布和复制。
- ScyllaDB: 继承了 Cassandra 的对等架构,同时通过改进 I/O 并行性,基于 C++ 实现,专注于更高性能和更低的延迟。
- DragonflyDB: 基于类似 Redis 的设计,支持主从模式,但目前还没有成熟的多节点分布式架构。主要用于缓存场景。
- TiKV: 基于Raft 协议的分布式事务系统,支持强一致性。TiKV 是 TiDB 的底层存储,通过Region(分片)进行数据分布,并使用多副本来保证高可用性。
- Couchbase: 采用分布式架构,通过分片和副本来实现扩展性和高可用性。它的一致性协议基于
DCP(Database Change Protocol),用于分布式同步。
3. 数据结构
- MongoDB: 使用文档模型存储数据,基于 JSON/BSON 格式。每条记录是一个文档,支持嵌套文档和数组,灵活的结构化和非结构化数据。
- Redis: Redis 是基于内存的数据存储,支持多种数据类型,包括字符串、哈希、列表、集合、有序集合等,非常适合缓存和实时数据处理。
- Cassandra: 基于列族存储模型(类似于键值对),适合处理大规模、稀疏数据。数据存储为列族和行,适合写多读少的应用场景。
- ScyllaDB: 与 Cassandra 相同的列族模型,但使用更加高效的底层实现。
- DragonflyDB: 类似 Redis,支持多种数据结构,如字符串、哈希、列表、集合和有序集合等,专注于内存中处理高效缓存。
- TiKV: 使用键值对存储模型,支持多种复杂的数据结构,通过与 TiDB 配合使用,支持 SQL 和事务模型。
- Couchbase: 使用文档存储模型,类似于 MongoDB,基于 JSON 文档,支持嵌套结构和数组。
4. 查询方式
- MongoDB: 提供强大的查询语言,支持基于字段的条件查询、索引查询、聚合查询等。支持丰富的操作符和管道操作。
- Redis: 通过命令行接口(CLI)或编程接口对其数据结构进行直接操作,查询能力较为简单,适合键值对操作和简单的集合、哈希等查询。
- Cassandra: 支持 CQL(Cassandra Query Language),类似于 SQL 的查询语言,但查询能力相对受限,主要适合范围查询和批量数据写入。
- ScyllaDB: 完全兼容 Cassandra 的 CQL 查询语言,但由于底层改进,查询性能更高。
- DragonflyDB: 类似于 Redis,通过命令行接口进行数据查询和操作,支持多种数据结构的操作,主要用于缓存场景。
- TiKV: 本身不提供直接查询接口,通常与 TiDB 配合使用,TiDB 提供 SQL 查询能力。TiKV 通过键值接口操作数据。
- Couchbase: 支持 N1QL(一种基于 SQL 的查询语言),适用于 JSON 文档的查询,支持索引、聚合和全文检索。
5. 存储引擎
- MongoDB: 使用WiredTiger 作为默认的存储引擎,支持压缩和加密,能够高效地处理读写操作。MongoDB 也可以使用其他存储引擎,如 MMAPv1(已弃用)。
- Redis: Redis 是基于内存的数据库,数据主要存储在内存中,并通过快照(RDB)或追加文件(AOF)来持久化到磁盘。
- Cassandra: 使用基于磁盘的存储引擎,采用SSTable 和 LSM Tree(Log-Structured Merge Tree)来优化写性能和磁盘 I/O。
- ScyllaDB: 同样使用 LSM Tree 存储引擎,但通过对现代硬件的优化(如直接 I/O 和异步线程管理),提升了性能和延迟。
- DragonflyDB: 类似 Redis,基于内存,但专注于高效的多线程设计和缓存场景。
- TiKV: 使用基于 RocksDB 的存储引擎,适合高并发的写入场景,支持事务处理。
- Couchbase: Couchbase 采用了基于内存和磁盘的混合存储引擎,支持对内存数据进行高效的查询,并定期将数据持久化到磁盘。
总结对比表:
| 数据库 | CAP 实现 | 分布式架构 | 数据结构 | 查询方式 | 存储引擎 |
|---|---|---|---|---|---|
| MongoDB | CP(默认) | 副本集+分片 | 文档模型 | 强大的查询语言 | WiredTiger |
| Redis | AP | 主从复制+集群 | 多种数据结构 | 命令行接口 | 内存存储,RDB/AOF |
| Cassandra | AP | 对等架构 | 列族模型 | CQL | LSM Tree/SSTable |
| ScyllaDB | AP | 对等架构 | 列族模型 | CQL | LSM Tree(高性能) |
| DragonflyDB | AP | 主从复制 | 多种数据结构 | 命令行接口 | 内存存储 |
| TiKV | CP | Raft 分布式架构 | 键值对 | 与 TiDB 配合 | RocksDB |
Q: 请在上表继续添加 cockroachdb,garnet,apache ignite, apache kvrocks
A: 以下是包含 CockroachDB、Garnet、Apache Ignite 和 Apache Kvrocks 的更新对比表,继续沿用 CAP 实现、分布式架构、数据结构、查询方式、存储引擎 维度。
| 数据库 | CAP 实现 | 分布式架构 | 数据结构 | 查询方式 | 存储引擎 |
|---|---|---|---|---|---|
| MongoDB | CP(默认) | 副本集+分片 | 文档模型 | 强大的查询语言 | WiredTiger |
| Redis | AP | 主从复制+集群 | 多种数据结构 | 命令行接口 | 内存存储,RDB/AOF |
| Cassandra | AP | 对等架构 | 列族模型 | CQL | LSM Tree/SSTable |
| ScyllaDB | AP | 对等架构 | 列族模型 | CQL | LSM Tree(高性能) |
| DragonflyDB | AP | 主从复制 | 多种数据结构 | 命令行接口 | 内存存储 |
| TiKV | CP | Raft 分布式架构 | 键值对 | 与 TiDB 配合 | RocksDB |
| Couchbase | CP/AP 可选 | 分片+副本 | 文档模型 | N1QL,支持 SQL | 基于内存和磁盘 |
| CockroachDB | CP | 基于 Raft 的对等架构 | 行存储模型 | 类 SQL 查询(SQL 兼容) | Pebble 存储引擎(基于 RocksDB) |
| Garnet | CP/AP 可选 | 分布式架构 | 多种数据结构 | 命令行接口 | 内存+持久化存储 |
| Apache Ignite | CP/AP 可选 | 分布式+内存计算 | 键值对/SQL | 支持 SQL、Cassandra 风格查询 | 内存优先,持久化到磁盘 |
| Apache Kvrocks | AP | 主从复制+集群 | 多种数据结构 | Redis 风格命令 | 基于 RocksDB |
6. CockroachDB
- CAP 实现: 强调一致性和分区容忍性(CP),通过 Raft 协议实现分布式一致性和事务性。
- 分布式架构: 使用对等架构,基于 Raft 的复制来保证强一致性和高可用性。各节点对等,通过自动分片和副本管理进行横向扩展。
- 数据结构: 类似于关系型数据库,采用行存储模型,支持 ACID 事务。
- 查询方式: 完全支持 SQL,兼容 PostgreSQL 查询语法,适合关系型查询和复杂事务操作。
- 存储引擎: 使用 CockroachDB 自己的Pebble 存储引擎,基于 RocksDB,专为高性能的分布式事务设计。
7. Garnet
- CAP 实现: 提供 CP 和 AP 模型之间的灵活选择,可以根据应用场景调整一致性和可用性。
- 分布式架构: 通过副本和分片机制实现分布式存储,支持自动扩展和高可用性。
- 数据结构: 支持多种数据结构(如键值对、哈希、列表等),类似于 Redis 和 DragonflyDB。
- 查询方式: 通过命令行接口进行数据操作,适合缓存和实时数据处理场景。
- 存储引擎: 结合内存和持久化存储,适合高并发场景下的数据存储与查询。
8. Apache Ignite
- CAP 实现: 提供可配置的 CAP 实现,允许用户选择强一致性(CP)或高可用性(AP),视需求而定。
- 分布式架构: 基于内存的分布式架构,支持横向扩展和高性能计算,通过复制和分片实现数据分布和高可用性。
- 数据结构: 支持键值对和SQL 结构化数据,支持复杂的内存计算和大数据处理,兼容 HDFS、Cassandra 风格的存储。
- 查询方式: 提供 SQL 支持,也支持类似 Cassandra 风格的查询,适合大规模数据计算和实时分析。
- 存储引擎: 以内存优先(In-Memory Computing),但支持将数据持久化到磁盘以确保数据安全性。
9. Apache Kvrocks
- CAP 实现: 偏向 AP 模型,专注于高可用性和分区容忍性。
- 分布式架构: 支持主从复制和集群模式,类似 Redis 的分片机制。
- 数据结构: 支持多种数据结构,类似于 Redis,包括字符串、哈希、列表、集合等。
- 查询方式: 使用与 Redis 类似的命令行接口,支持 Redis 风格的查询和数据操作。
- 存储引擎: 基于 RocksDB 存储引擎,提供持久化支持,与 Redis 相比更注重数据的持久化和高并发写入性能。
以下是更新后的 NoSQL 数据库对比表,增加了“事务支持程度”列,对各个数据库的事务支持做了详细说明。
| 数据库 | CAP 实现 | 分布式架构 | 数据结构 | 查询方式 | 存储引擎 | 事务支持程度 |
|---|---|---|---|---|---|---|
| MongoDB | CP(默认) | 副本集+分片 | 文档模型 | 强大的查询语言 | WiredTiger | 支持多文档 ACID 事务,在 4.0 及以上版本中支持多文档事务 |
| Redis | AP | 主从复制+集群 | 多种数据结构 | 命令行接口 | 内存存储,RDB/AOF | 不支持分布式事务,支持单实例内的 Lua 脚本作为事务的替代 |
| Cassandra | AP | 对等架构 | 列族模型 | CQL | LSM Tree/SSTable | 支持轻量级事务(LWT),提供有限的事务支持(行级别的事务) |
| ScyllaDB | AP | 对等架构 | 列族模型 | CQL | LSM Tree(高性能) | 支持轻量级事务,与 Cassandra 类似,行级事务支持有限 |
| DragonflyDB | AP | 主从复制 | 多种数据结构 | 命令行接口 | 内存存储 | 不支持事务,专注于高效的缓存场景 |
| TiKV | CP | Raft 分布式架构 | 键值对 | 与 TiDB 配合 | RocksDB | 支持分布式 ACID 事务,通过 TiDB 提供完整的分布式事务支持 |
| Couchbase | CP/AP 可选 | 分片+副本 | 文档模型 | N1QL,支持 SQL | 基于内存和磁盘 | 支持 ACID 事务,但主要用于单节点或副本之间,分布式事务支持较弱 |
| CockroachDB | CP | 基于 Raft 的对等架构 | 行存储模型 | 类 SQL 查询(SQL 兼容) | Pebble 存储引擎(基于 RocksDB) | 支持强一致性的分布式 ACID 事务,完全支持分布式事务 |
| Garnet | CP/AP 可选 | 分布式架构 | 多种数据结构 | 命令行接口 | 内存+持久化存储 | 支持简单事务,但事务模型相对简单,主要针对内存中的数据 |
| Apache Ignite | CP/AP 可选 | 分布式+内存计算 | 键值对/SQL | 支持 SQL、Cassandra 风格查询 | 内存优先,持久化到磁盘 | 支持分布式事务,提供 ACID 事务支持,适用于内存计算和数据一致性 |
| Apache Kvrocks | AP | 主从复制+集群 | 多种数据结构 | Redis 风格命令 | 基于 RocksDB | 不支持分布式事务,专注于持久化和高并发操作 |
事务支持程度总结:
支持分布式 ACID 事务:
- TiKV(通过 TiDB)
- CockroachDB
- Apache Ignite
支持轻量级事务(LWT)或行级事务:
- Cassandra
- ScyllaDB
支持单节点 ACID 事务或简单事务:
- MongoDB(多文档事务支持)
- Couchbase
- Garnet
不支持事务或支持极为有限:
- Redis(单实例 Lua 脚本模拟事务)
- DragonflyDB
- Apache Kvrocks
结论:
数据库对事务的支持差异较大,像 CockroachDB 和 TiKV 专门设计用于支持强一致性的分布式事务,而 Cassandra 和 ScyllaDB 则通过轻量级事务提供有限的事务支持。类似 Redis 和 DragonflyDB 的缓存数据库则没有事务支持或仅在单节点上提供简单的替代方案。
以下是更新后的 NoSQL 数据库对比表,新增了 Couchbase,并增加了 实现语言 一列。
| 数据库 | CAP 实现 | 分布式架构 | 数据结构 | 查询方式 | 存储引擎 | 事务支持程度 | 实现语言 |
|---|---|---|---|---|---|---|---|
| MongoDB | CP(默认) | 副本集+分片 | 文档模型 | 强大的查询语言 | WiredTiger | 支持多文档 ACID 事务,在 4.0 及以上版本中支持多文档事务 | C++ |
| Redis | AP | 主从复制+集群 | 多种数据结构 | 命令行接口 | 内存存储,RDB/AOF | 不支持分布式事务,支持单实例内的 Lua 脚本作为事务的替代 | C |
| Cassandra | AP | 对等架构 | 列族模型 | CQL | LSM Tree/SSTable | 支持轻量级事务(LWT),提供有限的事务支持(行级别的事务) | Java |
| ScyllaDB | AP | 对等架构 | 列族模型 | CQL | LSM Tree(高性能) | 支持轻量级事务,与 Cassandra 类似,行级事务支持有限 | C++ |
| DragonflyDB | AP | 主从复制 | 多种数据结构 | 命令行接口 | 内存存储 | 不支持事务,专注于高效的缓存场景 | C++ |
| TiKV | CP | Raft 分布式架构 | 键值对 | 与 TiDB 配合 | RocksDB | 支持分布式 ACID 事务,通过 TiDB 提供完整的分布式事务支持 | Rust |
| Couchbase | CP/AP 可选 | 分片+副本 | 文档模型 | N1QL,支持 SQL | 基于内存和磁盘 | 支持 ACID 事务,支持多文档事务,但分布式事务支持较弱 | C, C++, Go |
| CockroachDB | CP | 基于 Raft 的对等架构 | 行存储模型 | 类 SQL 查询(SQL 兼容) | Pebble 存储引擎(基于 RocksDB) | 支持强一致性的分布式 ACID 事务,完全支持分布式事务 | Go |
| Garnet | CP/AP 可选 | 分布式架构 | 多种数据结构 | 命令行接口 | 内存+持久化存储 | 支持简单事务,但事务模型相对简单,主要针对内存中的数据 | C |
| Apache Ignite | CP/AP 可选 | 分布式+内存计算 | 键值对/SQL | 支持 SQL、Cassandra 风格查询 | 内存优先,持久化到磁盘 | 支持分布式事务,提供 ACID 事务支持,适用于内存计算和数据一致性 | Java |
| Apache Kvrocks | AP | 主从复制+集群 | 多种数据结构 | Redis 风格命令 | 基于 RocksDB | 不支持分布式事务,专注于持久化和高并发操作 | C++ |
事务支持程度总结:
支持分布式 ACID 事务:
- TiKV(通过 TiDB)
- CockroachDB
- Apache Ignite
支持轻量级事务(LWT)或行级事务:
- Cassandra
- ScyllaDB
支持单节点 ACID 事务或简单事务:
- MongoDB(多文档事务支持)
- Couchbase
- Garnet
不支持事务或支持极为有限:
- Redis(单实例 Lua 脚本模拟事务)
- DragonflyDB
- Apache Kvrocks
实现语言总结:
- C、C++: 多数高性能数据库或缓存系统,如 Redis、ScyllaDB、DragonflyDB 等,倾向于使用 C 或 C++ 来优化性能。
- Java: 像 Cassandra 和 Apache Ignite 这种强调整合与大规模计算的数据库,基于 Java 实现,具有更好的 JVM 生态整合。
- Rust 和 Go: 越来越多的分布式数据库选择 Rust(如 TiKV)或 Go(如 CockroachDB)作为实现语言,因其安全性、并发模型和性能优化能力。
常用 NoSQL 比较的更多相关文章
- Mongodb学习总结(1)——常用NoSql数据库比较
虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举. 但是NoSQL数据库之间的不同,远超过两 SQ ...
- 常用NoSql数据库比较
1. CouchDB 所用语言: Erlang 特点:DB一致性,易于使用 使用许可: Apache 协议: HTTP/REST 双向数据复制, 持续进行或临时处理, 处理时带冲突检查, 因此,采用的 ...
- 一站式SpringBoot for NoSQL Study Tutorial 开发教程学习手册
SpringBoot2.0 + NoSQL使用教程,项目名称:“SpringBoot2NoSQL” 项目地址: https://gitee.com/475660/SpringBoot2NoSQL 项目 ...
- Linux实战教学笔记44:NoSQL数据库开篇之应用指南
第1章 NoSQL数据库 1.1 NoSQL概述 自关系型数据库诞生40年以来,从理论产生发展到现实产品,例如:大家最常见的MySQL和Oracle,逐渐在数据库领域里上升到了霸主地位,形成每年高达数 ...
- Java 学习路线以及各阶段学习书籍,博文,视频的分享
感谢: 感谢每一个打开这篇文章的人,听我在这里瞎扯!至于我为什么会有闲情写这篇文章呢?因为我每天想的是为什么要给我这样的需求,背后的人性是什么,我能再做些什么能让他更好.久而久之,我也稍微有了些自己的 ...
- web开发中对缓存的使用
很久没有发表随笔了,最近工作不是太忙,抽点时间 给大家谈谈缓存吧 ; 在我从事web开发的几年实践中 接触了缓存技术 也是比较多的,在最初的 项目当中 我们用到 hibernate 的 一二级缓存, ...
- 较大的互联网公司对Java的要求(转)
现在各大互联网公司,对Java类的校招要求越来越高,导致很多小伙伴都很迷茫,今天分享一篇谢照东关于Java学习进阶之路,希望能帮助到一些人 佛说五蕴六毒是妄,将因果都念作业障 把看过的书罗列一下 &l ...
- MySQL:初识数据库
对于大型互联网公司来说,数据的重要性可能比软件本身更重要.据说淘宝业务系统的开发大概消耗约7000万人民币,而其保存的用户数据的价值远高于此,加上数据分析算法的加持,其产生的价值和收益无疑是巨大的,远 ...
- 2013最常用的NoSQL数据库
摘要:与关系数据库相比,每个NoSQL都有自己不同的适用场景,这里带大家盘点文档数据库.图数据库.键值数据存储.列存储数据库与内存数据网络等领域的常用的NoSQL. 在几年内,NoSQL数据库一直以性 ...
- 一网打尽2013最常用的NoSQL数据库
摘要:与关系数据库相比,每个NoSQL都有自己不同的适用场景,这里带大家盘点文档数据库.图数据库.键值数据存储.列存储数据库与内存数据网络等领域的常用的NoSQL. 在几年内,NoSQL数据库一直 ...
随机推荐
- Ant Design Vue 在表格中插入图片
这两天一直在用 Antdv 做一些小 demo,今天在做表格的时候想在表格中插入图片,简单翻了下文档和国内的博客,发现所有的方法竟然都不好使,最后还是在官网的示例代码中看到相关的部分,不得不说这种 u ...
- 数据库日常实操优质文章分享(含Oracle、MySQL等) | 2023年1月刊
墨天轮数据社区是一个专业的数据技术内容分享社区,汇集了来自各行业的专家大咖.一线技术人员,他们勤于记录.乐于分享,发布了众多国内外数据库技术相关的优质实操文章.文档.在这里,我们将为大家整理墨天轮网站 ...
- 托管服务简介IHostedService接口 继承 BackgroundSerice接口
1. 场景:代码运行在后台,比如服务器启动的时候在后台预先加载数据到缓存,每天凌晨3 点把数据到处到数据库备份,每隔5秒在两张表之间同步一次数据 : 2. 托管服务实现IHoutedService接口 ...
- 自定义指令 v-imgerror 当图片的 src 资源 无效 就替换 默认的 src 显示图片
// 回顾自定义指令 // 作用 : 自定义一些对dom操作的快捷指令 // 前提:指令就是用来操作 dom (v-if /v-show/v-for ....) // 语法:Vue.directive ...
- [Vue warn]: Error in v-on handler (Promise/async): "TypeError: Object(...) is not a function"
引用外部发文件时候,只是部分引用,所以原本是解构方式引用的,我忘记加{ }了
- ES6箭头函数和普通函数的区别
书写形式不同,箭头函数的定义方式更加简单 : this指向不同 箭头函数使用父级作用域的this 普通函数执行 window 箭头函数不能使用 new 生成实例对象 : 普通函数的参数是argumen ...
- 静态库封装之ComStr类
ComStr.h #pragma once #include <string> #include <vector> using namespace std; class Com ...
- kotlin集合——>迭代器、区间与数列
1.迭代器 对于遍历集合元素,Kotlin 标准库支持 迭代器 的常用机制⸺对象可按顺序提供对元素的访问权限,而 不会暴露集合的底层结构.当需要逐个处理集合的所有元素(例如打印值或对其进行类似更新)时 ...
- 快速部署sqlserver AlwaysOn集群
点击查看代码 丐版sqlserver集群 之前试过docker的,k8s的,然后发现,还是最朴素的是最简单的,希望有大佬能够汉化,他妈的,那些英文看得人要发癫啊. 前置准备,参照丐版pxc集群: ht ...
- 一文彻底弄懂MySQL的各个存储引擎,InnoDB、MyISAM、Memory、CSV、Archive、Merge、Federated、NDB
MySQL 中的存储引擎是其数据库管理系统的核心模块,用于处理不同类型的数据存储和检索操作.每种存储引擎都有自己的特点,适用于不同类型的应用场景.MySQL 最常用的存储引擎包括 InnoDB.MyI ...