我正在研究分布式数据库。我正在尝试生成一个唯一 ID,该 ID 将用作cassandra中的列族主键。
我阅读了一些关于使用 Java 执行此操作的文章,UUID
但似乎存在冲突的可能性(即使它非常低)。
我想知道是否有办法根据时间生成唯一 ID?
您可以使用TimeUUID
Cassandra 中的类型,它支持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。)
您应该使用Twitter Snowflake进行调查。从项目自述文件中:
当我们在 Twitter 从 Mysql 转向 Cassandra 时,我们需要一种新的方法来生成 ID 号。Cassandra 中没有顺序 id 生成工具,也不应该有。
Snowflake 使用一种直观的算法来生成按时间排序且唯一的多头。由于您的数据库是分布式的,因此该服务应该可以很好地满足您的需求。
正如理查德所说,您可以使用 TimeUUID,生成 TimeUUID 值并不是什么大问题。只需按照 cassandra 常见问题解答timeuuid 即可。
您需要使用 cassandra 函数now()
生成 timeuuid 并使用uuid()
函数生成 uuid 类型的字符串。