3

我一直在努力使用 NoRM ( http://normproject.org/ )附带的 HiLoIdGenerator ;我想用它来生成一个唯一标识符,我可以将它用作我的博客文章的 SLUG。目前,我使用 ObjectId 来唯一标识 MongoDB 中的文档,但由于这类似于 GUID,并且在 URL 中看起来不太好,我更喜欢使用类似 www.myblog.com/posts/1243 和所以这就是我决定使用 HiLoIdGenerator 的原因。

我想在客户端生成我的 HiLo id,我在 stuart harris 的博客http://red-badger.com/Blog/post/A-simple-IRepository3cT3e-implementation-for-MongoDB-and-NoRM上阅读.aspxNoRM 的新 HiLo Id 生成器也允许这样做,方法是为客户端会话分配一个整数范围,可以不受惩罚地使用(其他客户端将使用不同的范围)但是当我打开 HiLoIdGenerator 时,它说 HiLoIdGenerator类使用 HILO 算法生成一个新的标识值。在您的项目中只应使用此类的一个实例

我真的有三个问题:

1) 如果我的应用程序中有多个 HiLoIdGenerator 实例(假设我的服务类中有一个实例,它为每个新文档调用 GenerateId),我实际上可以保证我的所有 id 都是唯一的,因为代码HiLoIdGenerator 类说应用程序中应该只有这个类的一个实例?

2) HiLoIdGenerator 构造函数接受一个容量参数,我想知道它的作用,我传递了 0 并且所有生成的 Id 都是相同的,然后我传递了 1 个新的 HiLoIdGenerator(1) Id 从 1 开始并且是加 1;我不太了解它的作用,但我假设它与生成器可以生成的一系列潜在值有关,但我不确定,我想成为。有人可以解释这个论点吗?

3) 我想我理解 HiLo 算法的目的,如此处所述什么是 Hi/Lo 算法?但我不明白的是我是否可以有两个不同的应用程序的 MongoDB 实例,每个应用程序都查看 MongoDB 的不同实例但都包含相同的集合类型,生成的 id 是否是全局唯一的,即,我可以使用它们我想要一个 GUID 的方式,或者它们只是在给定的 MongoDB 实例中是唯一的,因此排除了以后将两个集合合并到一个 MongoDB 实例中?

谢谢

4

2 回答 2

1

请参阅此处了解如何生成单调递增的 id: http ://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22

于 2010-12-08T04:03:48.830 回答
0
  1. 是的,它们是唯一的,每个客户端(HiLoGenerator)都会请求一系列可以分配的 lo,但只有当它们都使用相同的容量时它们才是唯一的

  2. 容量是客户可以不受惩罚地分配的 ID 的数量,同样,如果您在客户之间有不同的容量,则您有可能创建非唯一值,如果您使用单调递增的 ID,您只会分配一个顺序值,您不需要 HiLo 算法,您只需要一个包含可以递增并分配给新实体的值的位置,请参阅 dm 的答案以了解此实现

  3. 是的,只要两个客户端都使用保存 Hi 值的同一个集合,并且两个客户端使用相同的容量来生成 lo

于 2011-03-31T00:21:33.420 回答