因为了解和喜欢 Java 社区,所以尽管很少有人将 NoSQL 与某种语言绑在一起,我也要为全世界的 Java 开发者写下这篇文章。文中,我将为你展示几种 NoSQL 数据库。之后,我将根据实际在 Github stars 和 Stack Overflow tags 的项目中的使用情况,选出最常用的五个。并且我会让你知道它们是否支持 Spring Data 和 SpringBoot。
为什么使用 NoSQL?
NoSQL 数据库帮助许多互联网公司通过最终一致性实现高可拓展性。因为 NoSQL 数据库通常分布在多台机器上,而且有一些延迟,所以它只保证所有的实例最终都是一致的。最终一致性服务通常被称为 BASE(基本可用,软状态,最终一致性)服务,这点与传统的 ACID 正好相反。
选择 NoSQL 的候选项
定义前五名可能很困难。最近许多人都在尝试这个。请参考本文结尾处的研究和注释部分。
八月中旬,我在推特上告诉我的粉丝,我正在写这篇文章。我询问了关于 NoSQL 数据库的正面或负面的评述,收到了人们的反馈,其中有希望我涵盖的一些选项。
我收到许多建议,以下按字母顺序列出:
- ArangoDB
- Cassandra
- Couchbase
- DynamoDB
- FaunaDB
- Hazelcast
- MongoDB
- Neo4j
- PostgreSQL JSON
- Redis
- (JetBrains) Xodus
人们还提到 Hibernate OGM(NoSQL 的 JPA)和 NoSQLUnit 来作为帮助访问和测试 NoSQL 数据库的工具。
请注意,我没有收到需要将 CouchDB,HBase,Elasticsearch 或 Solr 包括在内的任何请求。 由于 CouchDB 和 Couchbase 的名称相似,它们经常被混淆,但是它们是完全不一样的。 由于 CouchDB 是一个文件存储数据库,我将其包括在我的排名中。 我还添加了 HBase,因为它在 ITBusinessEdge,KDnuggets 和 DB-Engines 被提到过(在研究和注释部分)。 我没有将 Elasticsearch 或 Solr 包括在内,因为我相信这些并不常用作主数据存储。
aible 的排序技术
我用 Indeed 上职位数量、GitHub 上 star 数量、Stack Overflow 标签数和 Docker 上 pull 的数量作为指标去开发我的 TOP5 NoSQL 数据库排名系统。
Indeed 上职位数量
我在 Indeed Jobs 上不区分地域搜索,结果除了 Amazon 的 DynamoDB 显示出的是排行榜的竞争者外,并没有新奇发现。
NOTE:把“PostgreSQL JSON”做为搜索条件很难得到准确的结果,因为很多招聘信息把“PostgreSQL” 作为一个要求,而不是它对 NoSQL 的支持。因此我搜索“postgres + json”。Xodus 是一家公司的名字,所以我添加“JetBrains”关键字来保证结果的准确。
GitHub Stars
我搜索并找到了 5 个顶级(Star 最多)的 NoSQL 项目,分别是 Redis,MongoDB,ArangoDB,Neo4j 和 Cassandra。
注意: Cassandra, HBase 和 PostgreSQL 是镜像库。DynamoDB, Couchbase 和 FaunaDB 没有服务在 GitHub 上,因此,我统计他们的时候是基于他们的 Java 驱动。统计每个项目的 Java 驱动项目的星星数量是个好办法,但是 Redis 只有 11 颗星。
你可以使用 Tim Qian 的 历史 star 项目来查看这 5 个项目的 star 增长情况。
Stack Overflow 标签
我在 StackOverflow 中搜索了上述每一个数据库的 tag,发现 MongoDB 和 PostgreSQL 是最受欢迎的,接下来是 Neo4j, Cassandra 和 Redis.
Docker Pulls
我在 Docker Hub 上搜索了相关的镜像,可以看到少部分数据库有 1000 万以上的 Docker Pull,Neo4j 有 500 万以上,其他的大多数也有 100 多万, FaunaDB 和 JetBrains Xodus 暂时没有可用的镜像
综合来看,这些数据和我的排名关系并不大,我觉得可能有两个原因,数据并不精确而且对于每一个数据库,并没有所谓标准的镜像
NoSQL 选项矩阵
我创建了一个结合了职位数、星数和标签数的矩阵表格。我根据它们在每个类别的排名授予 1-5 分。如果一个选项没有进入前五,就得零分。结果排名前五的是 MongoDB、Redis、Cassandra、Neo4j 和 PostgreSQL,如下表所示。
NoSQL选项 | 职位 | 星 | 标签 | 合计 |
---|---|---|---|---|
MongoDB | 5 | 4 | 5 | 14 |
Redis | 3 | 5 | 1 | 9 |
Cassandra | 4 | 1 | 2 | 7 |
Neo4j | 0 | 2 | 3 | 5 |
PostgreSQL | 0 | 0 | 4 | 4 |
ArangoDB | 0 | 3 | 0 | 3 |
HBase | 2 | 0 | 0 | 2 |
DynamoDB | 1 | 0 | 0 | 1 |
Couchbase | 1 | 0 | 0 | 1 |
CouchDB | 0 | 0 | 0 | 0 |
Hazelcast | 0 | 0 | 0 | 0 |
JetBrains Xodus | 0 | 0 | 0 | 0 |
FaunaDB | 0 | 0 | 0 | 0 |
DB-Engines 排名的前五个选项是 PostgreSQL、MongoDB、Cassandra、Redis 和 HBase。
两个表格的前五排名非常接近!
NoSQL 选项概述
由于我做出的前五个排名结果非常接近于 DB-Engines 的结果,所以我将使用我的前五个结果。下面是对每一个的概述,以及关于它们的 Spring Boot 支持的信息。
你可能会问“为什么是 Spring Boot?” 我的答案很简单:因为 Spring Boot 采用率很高。根据 Redmonk 对 Java 框架的最近的观察, Spring Boot 采用率从 2016 年 9 月到 2017 年 6 月增长了 76%。
自 6 月以来的增长速度并没有减缓: 到 2017 年 8月 Maven 下载量是 2220 万。
MongoDB
MongoDB 在 2007 年由 DoubleClick、 ShopWiki 和 Gilt Groupe 的高级技术人员建立。它的源码在 GitHub 上,使用的是 Apache 和 GNU-APGL 许可证。它的众多大客户包括 Adobe、 eBay 和 eHarmony。
- 在 start.spring.io 上是否可用? 是的,包括用于测试的嵌入式 MongoDB 。
- 是否能在 Spring Data 上获得支持? 是的,通过 Spring Data MongoDB。
- 加分项: 为 Hibernate OGM、 NoSQLUnit 和 JHipster 所支持。
Redis
Redis 代表 REmote Dictionary Server(远程字典服务器),由 Salvatore Sanfilippo 开创。它最初发布于 2009 年 4 月 10 日根据 redis.io 的描述,Redis 是采用 BSD 许可证的内存式数据结构存储,可以被用作数据库、缓存和消息代理。 使用 Redis 的知名企业 包括 Twitter、 GitHub、 Snapchat 和 Craigslist。
- 是否在 start.spring.io 上可用? 是。
- 是否为 Spring Data 所支持? 是的,通过 Spring Data Redis。
- 加分项: 为 NoSQLUnit 所支持。Hibernate ORM 支持正在进行中。
Cassandra
Cassandra 是“一个管理结构化数据的分布式存储系统,其设计的目的是支持扩展到大数量级的商用服务器,并避免单点的失败” (引至 “Cassandra – 在 P2P 网络中的一种结构化存储系统” 在 Facebook 的工程博客上)。Facebook 最初开发 Cassandra 用于支持其收件箱的搜索功能。它的创始人,Avinash Lakshman (Amazon DynamoDB 的一位创始者) 和 Prashant Malik 在 2008 年七月把它作为开源项目发布。在 2009 年 3 月,Cassandra 成为了 Apache 的孵化器项目并在 2010 年 2 月成为了最高等级的项目。
除了 Facebook 之外, Cassandra 还帮助了许多企业实现网络规模的扩展。 关于其可扩展性的介绍在其主页上有很多惊人的数字。
其中一个最大的产品部署者是苹果公司,有超过 75000 个节点存储超过 10PB 的数据。其他大的 Cassandra 使用者包括 Netflix (2500 节点,420 TB,每天超过万亿的请求量),中国的搜索引擎宜搜 (270 节点,300 TB,每天超过 8 亿请求),eBay (超过 100 节点, 250 TB)。
- start.spring.io 中是否支持? 是。
- Spring Data 中是否支持? 是,通过 Spring Data Cassandra.
- 福利: NoSQLUnit 和 JHipster 已支持,Hibernate ORM 的支持正在进行中。
Neo4j
Neo4j 可以作为基于 GPL3 许可的“社区版”使用,带有 Affero GPL 下的一些扩展。社区版被限制只能在一个节点上运行,并且不包括对集群或热备份的支持。Neo4J 的“企业版”支持横向扩展,内存页缓存和热备份。可以试用 30 天,没有提供定价。
Neo4j 是众所周知的图数据库,所有内容都是以一个边,节点,或者一个属性的方式存储。版本 1.0 在 2010 年二月份发布,自此以来由 Neo4j 公司开发。它的大客户包括 Walmart, Airbnb, Monsanto, 和eBay.
- 是否在 start.spring.io上可以使用?是。
- Spring Data 是否支持 Neo4j ? 是的,通过 Spring Data Neo4j.
- 加分项:Hibernate ORM 和 NoSQLUnit 也支持 Neo4j
PostgreSQL JSON
PostgreSQL 是一种传统的关系数据库管理系统(RDBMS),它通过其本地的 JSON 支持(在版本 9.2 中添加)来支持 NoSQL。 在 9.4 中,他们添加了对二进制 JSON(也称为JSONB)和索引的支持。
Leigh Halliday 在 2017 年 6 月的博文中解释了如何释放在 Postgres 中存储 JSON 的功能。Halliday进一步展示了如何使用 Ruby on Rails。 一篇来自 Umair Shahid 的博文展示了如何使用 Java 处理 PostgreSQL JSON 和 JSONB 数据。
我不确定 PostgreSQL 及其 JSON 支持是否应该被包括在推荐的 NoSQL 选项中。 但如果你已经在使用 PostgreSQL,并希望使你的数据架构能更自由流畅,那可以尝试这么做。 正如 Dj Walker-Morgan 所说:“PostgreSQL 9.5 不是你的下一个会选 JSON 数据库,但它是一个非常好的关系数据库,具有完整的 JSON 特性。”
- 在 start.spring.io 是否可用?是的。
- 是否由 Spring 数据支撑?是的,通过 Spring Data JPA。
结束语
我对这个分析的结果感觉很满意,作为 JHipster 项目的提交者,我非常清楚该团队的实力,并认为它对 MongoDB 和 Cassandra 的支持就是对它们最好的认可。并且增加对 Couchbase 的支持的工作也在进行中。
此外,我还与我熟知的 Java 和 NoSQL 社区中几位专家分享了这一情况,并向他们询问了以下问题:
- 您是否同意我选出的前 5 个 NoSQL 选项(MongoDB,Redis,Cassandra,Neo4j 和 PostgreSQL 及其 JSON 支持)?
- 在生产中使用这些数据库有什么好的坏的故事或经验分享吗?
- 在这些数据库中,有没有特别难以开始使用或者在长期使用过程中难以维护的?
- 你最喜欢的 NoSQL 数据库是什么?
- 还有什么你想分享的?
我将在几周后公布采访结果。届时我将会在博客中更新。如果你是 NoSQL 数据库的专家,欢迎与我取得联系!我很乐意将您的答案纳入面试。你只需发送消息到 Twitter 的 @mraible 或 matt.raible@okta.com。