开发者

Show all keys with phpcassa

I'm fairly new to cassandra but i have making good progress so far.

$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 />";
}

Im using th开发者_Python百科is type of query to get specific date from somebodys email adress. However, i now want to do 2 things.

  1. Count every user in the database and display the number
  2. List every user in the database with $columns['name']." ".$columns['email']

In mysql i would just remove the 'where attribute' from the select query, however i think its a little bit more complicated here?


In Cassandra there's no easy way to count all of the rows. You basically have to scan everything. If this is something that you want to do often, you're doing it wrong. Example code:

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

The second answer is similar:

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


Tyler Hobbs give very nice example.

However if you have many users, you do not want to iterate on them all the time.

It is better to have this iteration once or twice per day and to store the data in cassandra or memcached / redis.


I also would do a CF with single row and put all usernames (or user keys) there on single row. However some considered this as odd practice and some people will not recommend it. Then you do:

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

note get_count() is slow operation too, so you still need to cache it.

If get_count() returns 100, you will need to upgrade your phpcassa to latest version.


About second part - if you have less 4000-5000 users, I would once again do something odd - put then on single row as supercolumns. Then read will be with just one operation:

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜