65.9K
CodeProject 正在变化。 阅读更多。
Home

RavenDB - 简介

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (36投票s)

2010 年 4 月 20 日

CPOL

7分钟阅读

viewsIcon

317752

downloadIcon

2710

RavenDB 简介 - 一个使用 .NET 4.0 和 VS 2010 的新开源 .NET 文档数据库

引言

RavenDB 是一个全新的开源 .NET 文档数据库。如果您之前从未接触过文档数据库,最简单的理解方式是想象将您的对象序列化并存储在应用程序所在的硬盘上。如果您使用键或任何最常用的查找方法来存储它,那么在不映射到 SQL 数据库的行和列之间进行转换的情况下,就能很容易地检索整个对象。处理更复杂的查找方式、并发等问题会更困难,因此才有了文档数据库。存储的文档不一定需要是序列化的对象(可以存储与对象无关的任意文档),但这可能是最常用的使用方式。只需记住,这是一种完全不同的数据存储方式,所以您可能不应该总是像对待 SQL 数据库那样来处理它。包含了一个 .NET 客户端用于与服务器通信,但底层表示是 HTTP/JSON - 因此任何能够通过 HTTP/JSON 与服务器通信的客户端都可以工作。

简单示例

RavenDBIntro/simpleexample2.jpg

这是一个将两个任意 POCO 对象存储在 RavenDB 中、查询它们并将一些信息打印到屏幕上的简单示例。在此示例中,RavenDB 服务器与客户端在同一台机器上,但这并非必须(稍后会详细介绍)。请注意,我无需创建表,无需将列和类映射到表,也无需创建任何存储过程。Company 类甚至没有标记为 Serializable - 它就能正常工作。

同时请注意,创建 DocumentStore 对象应被视为一项昂贵的操作,类似于在 NHibernate 中创建会话工厂。目前情况并非如此,但未来计划中有可能会改变这一点。

服务器和客户端

RavenDBIntro/ravenserver.jpg

在启动服务器并运行上述示例时,您将在服务器中看到类似于上面的输出(使用了 log4net,因此可以将控制台日志记录关闭或将其定向到文件)。这里有很多有趣的事情正在发生。首先,请注意,它并没有提交两个命令,而是将它们批量处理并在 SaveChanges() 调用中一次性提交。其次,在批量操作后,它开始处理适用于已保存文档的索引,并能够查询和返回这些文档。

除了上面显示的客户端/服务器方法外,如果没有分布式架构的需求,您还可以直接将服务器功能嵌入到您的应用程序中。

基于浏览器的管理工具

RavenDBIntro/browser1.jpg

一旦 Raven 服务器运行起来,就可以通过浏览器访问它来检查其内容、索引并查看文档。

RavenDBIntro/browser2.jpg

RavenDBIntro/browser3.jpg

您甚至可以使用浏览器编辑文档和索引定义。

索引和性能

您中目光敏锐的人可能已经注意到上面简单示例中查询的 "WaitForNonStaleResults" 方法调用。在设计使用索引的系统时,您可以采取几种方法:

  • 当数据更改时,让客户端等待索引更新
  • 当读取索引数据时,如果数据不是最新的(过时的),则让客户端等待
  • 在更新或读取时,不让客户端等待,只告知客户端数据是否过时

出于性能考虑,RavenDB 采用第三种方法,但如果您想让它等待,可以使用 WaitForNonStaleResults 方法。很有可能,如果省略了该方法,并且在插入和读取之间发生了任何其他操作(因为索引更新时间通常在几十毫秒内),它仍然会工作。通常,在索引更新期间获取过时数据,并在下一次视图或查询时获取更新后的数据就足够且成本更低。

使用 LINQ 添加新索引

可以通过 Web UI 或编程方式创建或编辑索引。这里我将展示如何使用 WebUI 添加一个新索引并使用该索引进行查询。

首先,使用 LINQ 语法创建索引

RavenDBIntro/indexCreate.jpg

使用 Lucene 语法编写一个使用该索引的查询,用于 where 语句

RavenDBIntro/simpleclientwithwhere.jpg

服务器将识别出索引存在,并通过 Lucene 使用它来获取较小的结果集,而不是扫描所有项目。

分片

Raven DB 还支持分片,即将数据分区到多个服务器上。例如,如果我们知道有许多公司分布在多个地区,并且希望将某些地区放在一个服务器上,而其他地区放在另一个服务器上,我们可以实现这一点。分片的設計基於 Hibernate Shards,所以如果您熟悉它,会注意到一些相似之处。

这是一个使用分片的示例(包含在 RavenDB 源代码的示例项目中)

RavenDBIntro/shardSample.jpg

在使用分片时,您必须制定分区数据的规则。在此示例中,我们将假设有 2 个分片,位于 A 地区的公司进入分片 1,位于 B 地区的公司进入分片 2。为了实现这一点,我们将创建一个实现 IShardStrategy 的具体实例,它定义了分片的三个部分行为。

RavenDBIntro/shardStrategy.jpg

ShardSelectionStrategy 是它知道如何将新项目放入哪个分片。

RavenDBIntro/shardSelection.jpg

分片访问策略控制它如何跨多个分片执行查询。在这里,我使用了内置的并行方法,它将同时查询所有分片并返回结果。我还使用了现有的解析策略,该策略会搜索所有分片。有关这些策略背后思想的更多信息,请参阅 Hibernate Shards 文档

使用新的 .NET 4.0/VS2010 功能实现的功能

ParallelShardAccessStrategy 使用了 .NET 4.0 中的新 Tasks 功能。这是同时查询所有分片的代码。

RavenDBIntro/shardParallel.jpg

有一个 expando 对象实现,它允许动态访问 JSON 对象。

RavenDBIntro/jsonExpando.jpg

请参阅源代码以获取更多示例和详细信息。

下一步该做什么

要运行此处所示的示例,请下载源代码 zip 文件,在 VS 2010 中打开它并构建解决方案。运行 Raven.Server 以启动服务器,然后启动简单的客户端示例,取消注释最初用于向数据库插入数据以填充一些数据的代码。要运行分片示例,您需要复制 Raven.Server bin 目录并更改其配置以监听不同的端口,以便您可以在同一台机器上同时运行两个服务器(或使用另一台机器)。第一次运行服务器时,它会检测其端口是否不可访问并授予权限,这将提示您进行管理员访问。

产品中有比我在此展示的更多的功能 - 要了解其余部分,请查看代码并进行探索。源代码仓库位于 github 上,地址为 http://github.com/ravendb/ravendb - 但当前源代码和此处的示例代码包含在文章中。如果您想贡献代码,可以使用 git 获取所有代码,或者只需使用 github 在上述链接中提供的“下载源代码”按钮下载所有需要的文件。您还会在 github 上找到一个问题列表,如果您想参与并帮助解决一个较小的问题以熟悉 git 和 VS 2010,那就去吧。

此外,请参阅 Oren 的博客,其中包含许多与 Raven 在构建过程中相关的帖子,提供了对设计决策等的见解。

这是我在 Windows 机器上本地运行 git 的说明

到目前为止,使用 Git GUI(而不是命令行)对我来说效果很好,即使在使用一些更复杂的场景时,例如创建和合并分支。了解 git 的分支命令行说明很有帮助,这样您就知道术语了,这些术语与 VSS/TFS/SVN 有很大不同。

该项目的用户组可以在 http://groups.google.com/group/ravendb 找到。

历史

  • 2010 年 4 月 26 日 - 初始版本
© . All rights reserved.