【发布时间】:2013-04-11 15:55:30
【问题描述】:
我正在开发一个分布式数据库。我正在尝试生成一个唯一 ID,该 ID 将用作cassandra 中的列族主键。
我阅读了一些关于使用 Java 使用 UUID 执行此操作的文章,但似乎存在冲突的可能性(即使它非常低)。
我想知道是否有办法根据时间生成唯一 ID?
【问题讨论】:
标签: cassandra cassandra uuid cql cql3
我正在开发一个分布式数据库。我正在尝试生成一个唯一 ID,该 ID 将用作cassandra 中的列族主键。
我阅读了一些关于使用 Java 使用 UUID 执行此操作的文章,但似乎存在冲突的可能性(即使它非常低)。
我想知道是否有办法根据时间生成唯一 ID?
【问题讨论】:
标签: cassandra cassandra uuid cql cql3
您可以在 Cassandra 中使用 TimeUUID 类型,它支持 Type 1 UUID。这使用当前时间和创建者的 MAC 地址和序列号。如果正确生成了 TimeUUID 编号,则可以通过零冲突来完成(您可以使用 CQL now() method 或插入您自己的,java SDK 提供了一些线程安全的实现)。 TimeUUIDs 的主要优点是 ID 可以按时间排序。请参阅http://wiki.apache.org/cassandra/TimeBaseUUIDNotes 了解更多信息。
但是,时间排序不太可能对行主键有用,因为在使用哈希分区器时排序是无用的,尽管可以使用 clustering key。如果您自己滚动,生成唯一 ID 的复杂性也可能是错误的来源。 Cassandra 还通过使用 UUID 类型支持 Type 4 UUID。这些只是随机位。有一个碰撞概率,但是碰撞概率(假设不相关的随机数源,如果你在 Java 中生成它将是)非常低 - 如果你在 100 年内每秒创造 10 亿个,那么一次碰撞的概率约为 50% . (详情请参阅http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates。)
【讨论】:
您应该使用Twitter Snowflake 进行调查。来自项目自述文件:
随着 Twitter 从 Mysql 转向 Cassandra,我们需要一种新的方法来生成 ID 号。 Cassandra 中没有顺序 id 生成工具,也不应该有。
Snowflake 使用一种直观的算法来生成按时间排序且唯一的 long。由于您的数据库是分布式的,因此该服务应该可以很好地满足您的需求。
【讨论】:
正如 Richard 所说,您可以使用 TimeUUID,生成 TimeUUID 值并不是什么大问题。只需关注 cassandra 常见问题解答timeuuid。
【讨论】:
需要使用cassandra函数now()生成timeuuid,使用uuid()函数生成uuid类型字符串。
【讨论】: