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