我一直在与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.aspx上读到 NoRM的新HiLo Id生成器也通过为客户端分配一系列整数来实现这一点可以不受惩罚地使用的会话(其他客户端将使用不同的范围)但是当我打开HiLoIdGenerator时,它说HiLoIdGenerator 类使用HILO算法生成新的标识值。在您的项目中只应使用此类的一个实例。
我真的有三个问题:
1)如果我的应用程序中有多个HiLoIdGenerator实例(假设我的服务类中有一个实例,每个新文档都调用了GenerateId),我实际上可以保证我的所有id都是唯一的,因为HiLoIdGenerator类的代码表示应用程序中只应该有一个这个类的实例?
2)HiLoIdGenerator构造函数接受一个容量参数,我想知道它是做什么的,我传递0并且所有生成的Id都是相同的,然后我传入了1个新的HiLoIdGenerator(1)Id开始于1并且增加1;我真的不明白它的作用,但我认为它与发电机可以产生的一系列潜在价值有关,但我不确定,我希望如此。有人可以解释一下这个论点吗?
3)我认为我理解HiLo算法的目标,如What's the Hi/Lo algorithm?所解释的那样,但我不明白的是,我是否可以拥有两个具有两个不同应用程序的MongoDB实例,每个实例都查看不同的实例一个MongoDB但是都包含相同的集合类型,生成的id是全局唯一的,也就是说,我可以像GUID那样使用它们,或者它们在MongoDB的给定实例中是否是唯一的,因此排除了两个集合的合并以后是MongoDB的单个实例吗?
感谢
答案 0 :(得分:1)
请参阅此处了解如何生成单调增加的ID: http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22
答案 1 :(得分:0)
是的,它们将是唯一的,每个客户(HiLoGenerator)都会请求可以分配的一系列lo,但只有当它们都使用相同的容量时它们才是唯一的
容量是客户可以分配而不受惩罚的Id的数量,如果您有可能创建非唯一值的客户端中的容量不同,如果您使用的是单调增加的Id,那么您只是在分配单个顺序值时,您不需要HiLo算法,只需要一个包含可以递增并分配给新实体的值的位置,请参阅dm的答案以实现此
是的,只要两个客户都使用包含Hi值的相同集合,并且只要两个客户都使用相同的capcity来生成lo