2

我对 cassandra 还很陌生,但到目前为止我已经取得了不错的进展。

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

$index_exp = CassandraUtil::create_index_expression('email', 'John@dsaads.com');
$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 />";
}

我使用这种类型的查询从某人的电子邮件地址获取特定日期。但是,我现在想做两件事。

  1. 统计数据库中的每个用户并显示数量
  2. 使用 $columns['name'] 列出数据库中的每个用户。" ".$columns['email']

在 mysql 中,我只会从选择查询中删除“where 属性”,但是我认为它在这里有点复杂?

4

2 回答 2

4

在 Cassandra 中,没有简单的方法来计算所有行。您基本上必须扫描所有内容。如果这是您想要经常做的事情,那么您做错了。示例代码:

$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"];
}
于 2011-05-05T17:10:49.000 回答
1

泰勒霍布斯举了一个很好的例子。

但是,如果您有很多用户,您不希望一直对他们进行迭代。

最好每天进行一次或两次迭代,并将数据存储在 cassandra 或 memcached / redis 中。


我也会用单行做一个 CF,并将所有用户名(或用户密钥)放在单行上。然而,有些人认为这是一种奇怪的做法,有些人不会推荐它。然后你做:

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

注意 get_count() 操作也很慢,所以你仍然需要缓存它。

如果 get_count() 返回 100,则需要将 phpcassa 升级到最新版本。


关于第二部分-如果您的用户少于 4000-5000,我会再次做一些奇怪的事情-然后将其放在单行上作为超级列。然后只需一项操作即可读取:

$users = $scf->get($rowkey = 0, new ColumnSlice("", "", 5000)); foreach($users as $user){ echo $user["name"]." ".$user["email"]; }

于 2012-08-11T18:39:42.980 回答