2011-11-23 79 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中的正常時間序列數據和分頁。