2013-02-27 59 views
2

我想設計一個卡桑德拉模式爲我的時間表:卡桑德拉架構時間表

我有用戶和每個用戶都有一個時間表,每個時間表值是一個字符串。

由於每個用戶都有一個字符串時間軸,我需要儘快填充每個用戶的時間軸。

我估計每個用戶都有10000個時間軸對象,而且我將有10000個用戶,所以我將容易擁有100,000,000個對象。這意味着速度非常重要。

這是我用過的代碼,是不是?

$pool = new ConnectionPool('Keyspace', array('127.0.0.1')); 
$cf = new ColumnFamily($pool, 'timeline'); 

// Insert a few records 
$columns = array(microtime() => "event1", microtime() => "event2", microtime() => "event3", microtime() => "event4"); 
$cf->insert('usera', $columns); 

回答

2

您可以使用​​作爲列鍵,就可以確保你得到的唯一密鑰,即使你有多個應用程序服務器在同一時間寫入數據(雖然不太可能兩個應用程序服務器可以在完全相同的插入一些microtime值),並且它們將按照時間順序排序,就像常規時間戳一樣。

如果您希望更頻繁地顯示最近的項目(例如,如果要顯示用戶最近的十個時間軸項目),您可能還想使用反向比較器。使用反向比較器意味着Cassandra將以相反順序存儲行,並且最新的項目在前。這意味着最近的項目將是Cassandra最容易找到的,並且您將獲得非常好的表現。

另一件需要考慮的事情就是你的行會有多寬。如果您不希望時間軸的時間長度超過一百萬左右(具體數量取決於每個項目中的數據量),那麼每個用戶有一行可能會工作(但是,再次嘗試使用一個反向比較器,否則讀取最近的項目將會很慢)。如果您希望用戶生成數百萬個時間軸項目,則需要考慮將用戶時間線分成多行的方法。也許每個用戶每月或每天一行。它需要是確定性的,這樣你就不必查詢來查找你應該閱讀的行,並且由於你的列按時排序,所以使用時間來分割成多行是很自然的。

+0

嗨,謝謝你的回答,我如何分區行? – Ata 2013-02-28 10:43:44

+0

嗨,你能看到thi鏈接並說我的問題:http://pastebin.com/fwJksrat – Ata 2013-02-28 11:05:56