我们正在研究将系统从RDBMS迁移到Cassandra,并且无法找到将自动增量列转换为Cassandra的方法。我们实际上根本不需要它是顺序的,它甚至可以包含字符,但它必须很短(理想情况下在8个字符下)并且全局唯一。理想的价值看起来像
AB123456
问题的第一部分是我们应该在应用程序代码中还是在Cassandra中生成此密钥?
第二部分: 如果卡桑德拉怎么样?
如果是应用程序代码,生成候选代码是否是可接受的模式然后尝试插入,如果发生冲突,则重新生成密钥候选并重试?
答案 0 :(得分:1)
在Cassandra中执行此操作的常用方法是使用uuid(如果ID应按时间排序,则使用timeuuid)。但这些必须很长才能获得唯一性 - 它们长16个字节。 (uuids是唯一的,因为碰撞的可能性非常低;因为它们包含有关生成主机的信息并包含时间,所以保证时间流是唯一的。)
如果您需要更短的密钥,则在插入之前通过检查无法可靠地找到冲突。在没有外部协调的情况下,总是存在竞争条件。来自Cassandra 2.0的是比较和设置,它可以让你这样做,但性能成本。
如果你使用一个随机的8个字符串,只包含数字和字母,那么就有36 ^ 8个可能的键,在大约sqrt(36 ^ 8)~100万个操作之后碰撞变得非常可能。您可以通过使用任何字符来改进这一点,因此有256 ^ 8个密钥,在大约sqrt(256 ^ 8)~40亿次操作之后可能发生冲突。这可能太低了,所以最好使用更长的ID。