Aerospike C 客戶端提供掃描指定 namespace 與 set 中所有記錄的能力。掃描透過掃描 API 定義:初始化並填充 as_scan 物件,再以以下任一操作執行:
aerospike_scan_foreach() — 執行掃描,對每筆記錄呼叫回呼函數(同步取得結果)。aerospike_scan_background() — 背景執行掃描,不等待結果,回傳掃描 ID 供狀態查詢。aerospike_scan_foreach() 執行掃描並對每筆找到的記錄逐一呼叫回呼函數。回呼函數簽名:
typedef bool (*aerospike_scan_foreach_callback)(const as_val *value, void *udata);
關鍵點:
value 參數傳遞,使用者資料透過 udata 傳遞。value 型別為 const as_val *,回呼函數不負責銷毀 該物件,且 value 僅在回呼作用域內有效,不可傳遞至作用域外。NULL 作為 value 呼叫回呼函數。value 為記錄,可用 as_record_fromval() 轉換為記錄物件;若非記錄則回傳 NULL。也可用 as_val_type() 檢查型別。bool callback(const as_val *value, void *udata) {
if (value == NULL) {
// 掃描完成
return true;
}
as_record *rec = as_record_fromval(value);
if (rec != NULL) {
// 處理記錄
}
return true; // 繼續掃描
}
aerospike_scan_background() 將請求送至伺服器執行,客戶端不等待結果,獲得 scan_id 供狀態追蹤。應用程式可定期輪詢狀態,理想情況下根據掃描進度智慧調整輪詢頻率。
狀態資訊填入 as_scan_info 物件:
as_scan_info scan_info;
if (aerospike_scan_info(&as, &err, NULL, scan_id, &scan_info) != AEROSPIKE_OK) {
fprintf(stderr, "err(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}
上述為單次檢查範例。若應用持續追蹤已耗時間,可檢查 scan_info.progress_pct 估算剩餘時間。