2011-05-04 27 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”]; }