2011-05-04 2 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 attribute'를 select 쿼리에서 제거 하겠지만, 여기서 좀 더 복잡하다고 생각 하는가?

답변

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);

참고 get_count()도 느린 작업이므로 캐시해야합니다.

get_count()가 100을 반환하면 phpcassa를 최신 버전으로 업그레이드해야합니다. 두 번째 부분에 대해


- supercolumns으로 단일 행에 다음 넣어 - 당신은 4000-5000 사용자가 적은 경우, 나는 다시 한 번 이상한 일을 할 것입니다. 그러면 읽기는 단 한 번의 작업으로 수행됩니다.

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