英文原文:NoSQL Options for Java Developers

因为了解和喜欢 Java 社区,所以尽管很少有人将 NoSQL 与某种语言绑在一起,我也要为全世界的 Java 开发者写下这篇文章。文中,我将为你展示几种 NoSQL 数据库。之后,我将根据实际在 Github stars 和 Stack Overflow tags 的项目中的使用情况,选出最常用的五个。并且我会让你知道它们是否支持 Spring Data 和 SpringBoot。

为什么使用 NoSQL?

NoSQL 数据库帮助许多互联网公司通过最终一致性实现高可拓展性。因为 NoSQL 数据库通常分布在多台机器上,而且有一些延迟,所以它只保证所有的实例最终都是一致的。最终一致性服务通常被称为 BASE(基本可用,软状态,最终一致性)服务,这点与传统的 ACID 正好相反。

选择 NoSQL 的候选项

定义前五名可能很困难。最近许多人都在尝试这个。请参考本文结尾处的研究和注释部分。

八月中旬,我在推特上告诉我的粉丝,我正在写这篇文章。我询问了关于 NoSQL 数据库的正面或负面的评述,收到了人们的反馈,其中有希望我涵盖的一些选项。

我收到许多建议,以下按字母顺序列出:

  1. ArangoDB
  2. Cassandra
  3. Couchbase
  4. DynamoDB
  5. FaunaDB
  6. Hazelcast
  7. MongoDB
  8. Neo4j
  9. PostgreSQL JSON
  10. Redis
  11. (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 社区中几位专家分享了这一情况,并向他们询问了以下问题:

  1. 您是否同意我选出的前 5 个 NoSQL 选项(MongoDB,Redis,Cassandra,Neo4j 和 PostgreSQL 及其 JSON 支持)?
  2. 在生产中使用这些数据库有什么好的坏的故事或经验分享吗?
  3. 在这些数据库中,有没有特别难以开始使用或者在长期使用过程中难以维护的?
  4. 你最喜欢的 NoSQL 数据库是什么?
  5. 还有什么你想分享的?

我将在几周后公布采访结果。届时我将会在博客中更新。如果你是 NoSQL 数据库的专家,欢迎与我取得联系!我很乐意将您的答案纳入面试。你只需发送消息到 Twitter 的 @mraiblematt.raible@okta.com