使用CassandraDB / MongoDB等进行自动增量/序列仿真

时间:2010-05-05 07:52:13

标签: mongodb cassandra nosql

我正在尝试使用nonsql Cassandra DB构建小型网络系统(url快捷方式),我堆栈的问题是id自动生成。

有人已经堆积了这个问题吗?

感谢。

P.S。 UUID不适合我,我需要使用从0到Long.MAX_VALUE(java)的所有数字。所以我确实需要一些与sql序列完全相同的东西

更新:

我对GUID ID不熟悉的原因在于我的应用程序范围。

我的应用程序有url快捷方式部分,我确实需要尽可能缩短网址。所以我遵循下一个方法:我从0开始将数字转换为base64字符串。所以在结果我有像mysite.com/QA(其中QA是基本64字符串)的网址。

这很容易使用SQL DB实现,我只是使用自动递增的ID,将其转换为URL并确保百分之百,该URL是唯一的。

3 个答案:

答案 0 :(得分:4)

不了解Cassandra,但是对于mongo,你可以有一个原子序列(它不会扩展,但会按照应有的方式工作,即使在分片环境中,如果查询具有分片字段)。

可以使用findandmodify命令完成。

我们假设我们有一个名为sequences的特殊集合,我们希望有一个邮政编号序列(名为postid),您可以使用与此类似的代码:

> db.runCommand( { "findandmodify" : "sequences",
                   "query" : { "name" : "postid"},
                   "update" : { $inc : { "id" : 1 }},
                   "new" : true } );

此命令将以原子方式返回更新的(new)文档以及状态。如果命令成功完成,value字段包含返回的文档。

答案 1 :(得分:3)

自动增量ID本身不能很好地扩展,因为它们需要单个源来生成数字。这就是为什么可攻击/可复制数据库(如MongoDB)为对象使用更长的GUID标识符的原因。为什么你需要如此糟糕的LONG值?

您可以使用原子增量来保留旧值,但我不确定。这仅限于单个服务器设置。

答案 2 :(得分:-1)

我不确定我是否跟着你。你用的是什么语言?我们在谈论uuid吗?

以下是如何使用某些语言生成UUID:

java.util.UUID.randomUUID(); // (Java) variant 2, version 4

import uuid   // (Python)
uuid.uuid1()  //  version 1