我正在研究一个分布式数据库。我正在尝试生成一个唯一的id,它将作为cassandra中的列族主键。我读了一些关于用java实现这一点的文章 UUID 但似乎有发生碰撞的可能性(即使很低)。我想知道是否有一种方法可以根据时间生成一个唯一的id?
UUID
kxeu7u2r1#
你应该调查使用twitter雪花。从项目自述:随着twitter从mysql转向cassandra,我们需要一种新的方法来生成身份证号码。Cassandra没有顺序id生成设施,也不应该有。snowflake使用了一种直观的算法,它可以生成时间顺序和唯一的long。因为您的数据库是分布式的,所以这个服务应该很适合您的需要。
mf98qq942#
正如richard所说,可以使用timeuuid,生成timeuuid值并不是什么大事。只需关注Cassandra常见问题解答。
6gpjuf903#
你需要使用Cassandra函数 now() 生成timeuuid并使用 uuid() 函数生成uuid类型字符串。
now()
uuid()
gijlo24d4#
你可以用 TimeUUID 输入cassandra,它支持类型1的uuid。它使用当前时间、创建者的mac地址和序列号。如果timeuuid号生成正确,这可以在零冲突的情况下完成(您可以使用cql now() 方法或插入自己的,JavaSDK提供了一些线程安全的实现)。主要优势 TimeUUIDs ID可以按时间排序。看到了吗http://wiki.apache.org/cassandra/timebaseuuidnotes 更多信息。但是,时间顺序对于行主键不太可能有用,因为在使用哈希分区器时,时间顺序是无用的,尽管可以使用集群键。而且,如果你自己动手,生成一个唯一id的复杂性也可能是一个bug的来源。cassandra还通过使用 UUID 类型。这些都是随机的。碰撞概率是存在的,但是碰撞概率(假设不相关的随机数源,如果用java生成的话就是这样)是非常低的——如果你在100年内每秒创造10亿次,那么一次碰撞的概率大约是50%(看到了吗http://en.wikipedia.org/wiki/universally_unique_identifier#random_uuid_probability_of_duplicates 更多细节。)
TimeUUID
TimeUUIDs
4条答案
按热度按时间kxeu7u2r1#
你应该调查使用twitter雪花。从项目自述:
随着twitter从mysql转向cassandra,我们需要一种新的方法来生成身份证号码。Cassandra没有顺序id生成设施,也不应该有。
snowflake使用了一种直观的算法,它可以生成时间顺序和唯一的long。因为您的数据库是分布式的,所以这个服务应该很适合您的需要。
mf98qq942#
正如richard所说,可以使用timeuuid,生成timeuuid值并不是什么大事。只需关注Cassandra常见问题解答。
6gpjuf903#
你需要使用Cassandra函数
now()
生成timeuuid并使用uuid()
函数生成uuid类型字符串。gijlo24d4#
你可以用
TimeUUID
输入cassandra,它支持类型1的uuid。它使用当前时间、创建者的mac地址和序列号。如果timeuuid号生成正确,这可以在零冲突的情况下完成(您可以使用cqlnow()
方法或插入自己的,JavaSDK提供了一些线程安全的实现)。主要优势TimeUUIDs
ID可以按时间排序。看到了吗http://wiki.apache.org/cassandra/timebaseuuidnotes 更多信息。但是,时间顺序对于行主键不太可能有用,因为在使用哈希分区器时,时间顺序是无用的,尽管可以使用集群键。而且,如果你自己动手,生成一个唯一id的复杂性也可能是一个bug的来源。cassandra还通过使用
UUID
类型。这些都是随机的。碰撞概率是存在的,但是碰撞概率(假设不相关的随机数源,如果用java生成的话就是这样)是非常低的——如果你在100年内每秒创造10亿次,那么一次碰撞的概率大约是50%(看到了吗http://en.wikipedia.org/wiki/universally_unique_identifier#random_uuid_probability_of_duplicates 更多细节。)