Cassandra:生成一个唯一的ID?

use*_*879 25 uuid cql cassandra cql3

我正在研究分布式数据库.我试图生成一个唯一的ID将作为列族主键.

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

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

Ric*_*ard 29

您可以使用TimeUUIDCassandra中的类型,它支持Type 1 UUID.这使用当前时间和创建者的MAC地址和序列号.如果正确生成了TimeUUID号,则可以通过零冲突完成(您可以使用CQL now() 方法或插入自己的方法,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.)

  • 如果您使用的是类型1 UUID,则应使用type timeuuid.这应该工作:CREATE TABLE时间轴(去掉timeuuid,PRIMARY KEY(rid)); 插入时间轴(rid)值(now()); (2认同)

noa*_*hlz 6

您应该使用Twitter Snowflake进行调查.从项目自述:

当我们在Twitter上从Mysql转向Cassandra时,我们需要一种新的方法来生成id号.在Cassandra中没有顺序id生成设施,也不应该存在.

Snowflake使用直观的算法生成长度,这些长度既有时间顺序又有独特性.由于您的数据库是分布式的,因此该服务应该很适合您的需求.


abh*_*bhi 6

正如理查德所说,你可以使用TimeUUID,并且生成TimeUUID值并不是什么大问题.只需按照cassandra FAQ timeuuid.