我从 http://doanduyhai.wordpress.com/2012/07/05/apache-cassandra-tricks-and-traps/ 偶然发现了 Cassandra/Python 中的一个可能答案
词典 TimeUUID 排序
在所有基本类型中,Cassandra 支持类型 1(基于时间和服务器)和类型 4(随机)的 UUID 值。
UUID(唯一通用标识符)的主要用途是在潜在的分布式环境中获取真正唯一的标识符。
Cassandra 确实支持版本 1 UUID。它通过结合计算机的 MAC 地址和自公历开始以来的 100 纳秒间隔数为您提供唯一标识符。
如您所见,精度仅为 100 纳秒,但幸运的是它与时钟序列混合以增加随机性。此外,MAC 地址也用于计算 UUID,因此您不太可能在一个机器集群上遇到冲突,除非您需要处理非常大量的数据(不要忘记,不是每个人都是 Twitter 或 Facebook) .
UUID 最相关的用例之一,尤其是 TimeUUID,是将其用作列键。由于 Cassandra 列键已排序,因此我们可以利用此功能为我们的列族进行自然排序。
Hector 客户端提供的默认 com.eaio.uuid.UUID 的问题是它不容易使用。作为 ID,您可能需要将此值从服务器带到视图层,这就是问题所在。
基本上,com.eaio.uuid.UUID 会覆盖 toString() 以提供 UUID 的字符串表示形式。但是这种字符串格式不能按字典顺序排序……
以下是一些连续生成的TimeUUID:
8e4cab00-c481-11e1-983b-20cf309ff6dc at some t1
2b6e3160-c482-11e1-addf-20cf309ff6dc at some t2 with t2 > t1
“2b6e3160-c482-11e1-addf-20cf309ff6dc”.compareTo(“8e4cab00-c481-11e1-983b-20cf309ff6dc”) 给出 -6 表示 “2b6e3160-c482-11e1-addf-20cf309ff6dc” 小于/在 “8e4cab00-c481-11e1-983b-20cf309ff6dc”之前> 这是不正确的。
TimeUUID当前文字显示拆分如下:
time_low – time_mid – time_high_and_version – variant_and_sequence – node
如果我们从 time_high_and_version 开始重新排序,我们可以按字典顺序对其进行排序:
time_high_and_version – time_mid – time_low – variant_and_sequence – node
实用程序类如下:
public static String reorderTimeUUId(String originalTimeUUID)
{
StringTokenizer tokens = new StringTokenizer(originalTimeUUID, "-");
if (tokens.countTokens() == 5)
{
String time_low = tokens.nextToken();
String time_mid = tokens.nextToken();
String time_high_and_version = tokens.nextToken();
String variant_and_sequence = tokens.nextToken();
String node = tokens.nextToken();
return time_high_and_version + '-' + time_mid + '-' + time_low + '-' + variant_and_sequence + '-' + node;
}
return originalTimeUUID;
}
TimeUUID 变为:
11e1-c481-8e4cab00-983b-20cf309ff6dc
11e1-c482-2b6e3160-addf-20cf309ff6dc
现在我们得到:
"11e1-c481-8e4cab00-983b-20cf309ff6dc".compareTo("11e1-c482-2b6e3160-addf-20cf309ff6dc") = -1