33

我正在研究分布式数据库。我正在尝试生成一个唯一 ID,该 ID 将用作中的列族主键

我阅读了一些关于使用 Java 执行此操作的文章,UUID但似乎存在冲突的可能性(即使它非常低)。

我想知道是否有办法根据时间生成唯一 ID?

4

4 回答 4

34

您可以使用TimeUUIDCassandra 中的类型,它支持Type 1 UUID。这使用当前时间和创建者的 MAC 地址和序列号。如果正确生成了 TimeUUID 编号,这可以通过零冲突来完成(您可以使用 CQLnow() 方法或插入您自己的方法,java SDK 提供了一些线程安全的实现)。的主要优点TimeUUIDs是 ID 可以按时间排序。有关更多信息,请参阅http://wiki.apache.org/cassandra/TimeBaseUUIDNotes

但是,时间排序不太可能对行主键有用,因为在使用散列分区器时排序是无用的,尽管可以使用集群键。如果您自己滚动,生成唯一 ID 的复杂性也可能是错误的来源。Cassandra 还通过使用类型来支持Type 4 UUIDUUID。这些只是随机位。有一个碰撞概率,但是碰撞概率(假设不相关的随机数源,如果你在 Java 中生成它将是)非常低 - 如果你在 100 年内每秒创造 10 亿个,那么一次碰撞的概率约为 50% . (有关更多详细信息,请参阅http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates。)

于 2013-04-18T14:03:48.267 回答
10

您应该使用Twitter Snowflake进行调查。从项目自述文件中:

当我们在 Twitter 从 Mysql 转向 Cassandra 时,我们需要一种新的方法来生成 ID 号。Cassandra 中没有顺序 id 生成工具,也不应该有。

Snowflake 使用一种直观的算法来生成按时间排序且唯一的多头。由于您的数据库是分布式的,因此该服务应该可以很好地满足您的需求。

于 2013-04-18T15:18:33.523 回答
7

正如理查德所说,您可以使用 TimeUUID,生成 TimeUUID 值并不是什么大问题。只需按照 cassandra 常见问题解答timeuuid 即可

于 2013-04-18T15:18:37.663 回答
3

您需要使用 cassandra 函数now()生成 timeuuid 并使用uuid()函数生成 uuid 类型的字符串。

于 2014-11-27T09:54:59.183 回答