
358
|
第八章
在此同時,它也會記錄那些刪除標記。當它掃描當前列的
KeyValue
時,可能會碰到這些
刪除標記,那些時間戳記小於等於該刪除標記的記錄,都會被認為是已經清除掉了。
圖 8-10 中顯示了
邏輯上的行
(
logical row
),它組成了一個
KeyValue
清單,某些儲存在
相同的儲存檔上,某些則在其他儲存檔中,它延伸了多個 column family。由於時間戳記
或者 Bloom 過濾器的排除過程,某些的儲存檔和 memstore 可能會被略過。最後一個儲
存檔中的刪除標記,可能會遮蔽掉所有的記錄,但是它們仍然是同一列的一部分。這些
scanner ─可以用一個指向儲存的箭頭表示—要不是指向檔案中的第一個配對項目,就
是沒有配對項目時,會緊接著所請求的 key 後面。
在呼叫
next()
法期間,只考慮位在適當列的 scanner。內部迴圈將會陸續地從第一到最
後一個儲存體中讀取
KeyValue
,依時間降序排列,直到它們也超出所請求 rowkey 範圍。
對於 scan 的操作,藉著重複呼叫
ResultScanner
的
next()
方法,直到已經找到停止列、
已經到達資料表尾端,或是針對目前的批次(透過 scanner 緩衝設定)已經讀取足夠的
列而停止掃描。
最終的結果是符合指定的 get 或者 scan 操作的一個
KeyValue
實體清單。這個清單會被
回傳給客戶端,客戶端就可以使用 API 方法來存取裡面的所包含的行欄位資料。
Region 的尋查
為了讓客戶端能夠找到控制的特定 rowkey ...