2011-11-23 44 views
4

可以说我有一个用户列家族具有独特的键名+预设为特定的客户端UUID cassandra排序?

<?php 
uniqid ("serverA");//generate something like; serverA4b3403665fea6 
?> 

我可以通过二级索引选择它们等,如:(从phpcassa生日例子)

$column_family = new ColumnFamily($conn, 'Indexed1'); 
$index_exp = CassandraUtil::create_index_expression('birthdate', 1984); 
$index_clause = CassandraUtil::create_index_clause(array($index_exp)); 
$rows = $column_family->get_indexed_slices($index_clause); 
// returns an Iterator over: 
// array('winston smith' => array('birthdate' => 1984)) 

foreach($rows as $key => $columns) { 
    // Do stuff with $key and $columns 
    Print_r($columns) 
} 

但是我只想查询每个页面和多个页面布局的30个最新添加用户(创建密钥),每个页面显示较老的密钥

我目前发现的唯一选择是使用来自phpcassa的uuid

uuid1()根据机器的当前时间和MAC地址生成UUID。

  • 优点:如果您希望能够按照创建时间对UUID进行排序,这很有用。
  • 缺点:潜在的隐私泄漏,因为它揭示了它是在哪个计算机上生成的,以及在什么时间生成的。
  • 可能的冲突:如果在同一台机器上同时生成两个UUID(100ns内)。 (或其他一些不太可能的 边际情况。)

uuid2()似乎不再使用。

uuid3()通过在某个名称空间(例如URL,域名等)中选择任意名称 的MD5哈希来生成UUID。

  • 优点:提供了一种将UUID块分配给不同名称空间的好方法。轻松从名称中重现UUID。
  • 缺点:如果你已经有一个独特的名字,为什么你需要一个UUID?
  • 可能的冲突:如果您在名称空间内重用名称,或者存在散列冲突。

uuid4()生成完全随机的UUID。

  • 优点:没有隐私问题。不必生成唯一的名称。
  • 缺点:UUID没有结构。
  • 碰撞可能:如果你使用了一个坏的随机数发生器,重用一个随机种子,或者是非常非常不幸的。

uuid5()相同uuid3(),除了使用SHA-1散列MD5代替 。正式优先于uuid3()

但是这意味着我必须重写一些零件+获得碰撞的可能性。

有没有我想不到的聪明黑客?

回答

3

首先,关于UUID,如果您打算使用uuid1()或uuid4()(这些是唯一真正被使用的),则不需要担心冲突。这种事件的可能性是天文数字低的。不要担心。

为了获得最近添加的30个密钥(以及分页功能),您真的在讨论时间序列数据。这是一个很好的intro to timeseries with Cassandra。您可以使用时间戳或v1 UUID作为列名,并使用唯一键作为列值。如果您选择将v1 UUID用于唯一键,则可以将这些直接放在列名称中。此时,您只需处理Cassandra中的正常时间序列数据和分页。