0

我们正在研究将系统从 RDBMS 迁移到 Cassandra,并且无法找到将自动增量列转换为 Cassandra 的方法。我们实际上根本不需要它是连续的,它甚至可以包含字符,但它必须很短(最好在 8 个字符以下)并且全局唯一。理想值看起来像

AB123456

问题的第一部分是我们应该在应用程序代码中还是在 Cassandra 中生成这个密钥?

第二部分:如果是 Cassandra,怎么办?

如果是应用程序代码,生成候选代码然后尝试插入是否是一种可接受的模式,如果发生冲突,则重新生成候选密钥并重试?

4

1 回答 1

1

在 Cassandra 中执行此操作的常用方法是使用 uuid(如果 ID 应按时间排序,则为 timeuuid)。但是这些必须很长才能获得唯一性——它们有 16 个字节长。(uuid 是唯一的,因为发生冲突的概率很低;timeuuid 保证唯一,因为它们包含有关生成主机的信息并包含时间。)

如果您需要较短的密钥,则无法通过在插入前进行检查来可靠地找到冲突。总会有竞争条件,如果没有外部协调,这将失败。Cassandra 2.0 引入了比较和设置功能,可以让您这样做,但会以性能为代价。

如果你使用一个随机的 8 个字符串,只包含数字和字母,则有 36^8 个可能的键,在大约 sqrt(36^8) ~ 100 万次操作后,很可能发生冲突。您可以通过使用任何字符来改进这一点,因此有 256^8 个键,在大约 sqrt(256^8) ~ 40 亿次操作之后可能会发生冲突。不过这可能太低了,所以最好使用更长的 ID。

于 2013-08-28T07:05:27.903 回答