2011-05-04 24 views
2

我對cassandra相當陌生,但迄今取得了很好的進展。用phpcassa顯示所有密鑰

$conn = new ConnectionPool('Cluster'); 
$User = new ColumnFamily($conn, 'User'); 

$index_exp = CassandraUtil::create_index_expression('email', '[email protected]'); 
$index_clause = CassandraUtil::create_index_clause(array($index_exp)); 
$rows = $User->get_indexed_slices($index_clause); 

foreach($rows as $key => $columns) { 
echo $columns['name']."<br />"; 
} 

我正在使用這種類型的查詢來從somebodys電子郵件地址獲得特定日期。 但是,我現在想做2件事。

  1. 計數數據庫中的每個用戶,並顯示該數字
  2. 每個用戶在$列[ '名']列出數據庫中。」」。$列[ '電子郵件']

在MySQL中,我只是從選擇查詢中刪除'where屬性',但是我認爲它在這裏更復雜一點?

回答

4

在卡桑德拉,沒有簡單的方法來統計所有的行。你基本上必須掃描一切。如果這是你想經常做的事情,那麼你做錯了。示例代碼:

$rows = $User->get_range("", "", 1000000); 
$count = 0; 
foreach($rows as $row) { 
    $count += 1; 
} 

第二個答案是相似的:

$rows = $User->get_range("", "", 1000000, null, array("name", "email")); 
foreach($rows as $key => $columns) { 
    echo $columns["name"]." ".$columns["email"]; 
} 
1

泰勒霍布斯給出非常好的例子。

但是,如果你有很多用戶,你不想一直迭代它們。

最好每天進行一次或兩次此迭代,並將數據存儲在cassandra或memcached/redis中。


我也會做單行CF,並把所有用戶名(或用戶鍵)放在單行。但有些人認爲這是奇怪的做法,有些人不會推薦它。然後你這樣做:

$ count = $ cf-> get_count($ rowkey = 0);

note get_count()也是慢操作,所以你仍然需要緩存它。

如果get_count()返回100,則需要將phpcassa升級到最新版本。


關於第二部分 - 如果你有少4000-5000的用戶,我想再次做一些奇怪的 - 然後把上單列爲supercolumns。然後閱讀將只有一個操作:

$ users = $ scf-> get($ rowkey = 0,new ColumnSlice(「」,「」,5000)); foreach($ users爲$ user){ echo $ user [「name」]。「」。$ user [「email」]; }