我正在尝试使用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是唯一的。
答案 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