標籤:分布式 nosql 記憶體資料庫 aerospike shard-nothing
查詢記錄
查詢時除了使用主索引,Aerospike C用戶端也提供API來通過檢索次索引查詢資料庫。
為了使用次索引查詢資料,首先應初始化並填充一個as_query對象;然後,以初始化完成的as_query對象,使用aerospike_query_foreach()執行查詢。一個查詢可以:
- 對返回的滿足條件記錄逐個調用回呼函數。
- 對返回的滿足條件記錄集合應用流式使用者定義函數(StreamUDF),再對StreamUDF返回結果調用回調用函數。
此章節專註於第一種方式,如想瞭解第二種方式,請參見【彙總】章節。
後面的代碼引用自樣本目錄【examples/query_examples/simple】,由Aerospike C用戶端安裝包內建。
請先閱讀:
- 【建立串連】章節,理解如何建立與叢集的串連。
- 【次索引管理】章節,理解如何建立次索引。
定義查詢
首先,初始化和構建一個的查詢對象。下面代碼片斷初始化了一個查詢對象,要尋找的資料所在的namespace名稱為“test”、set名稱為“demoset”,尋找bin名是 "test-bin"且整型值等於7的記錄。相當於SQL語句:“select * from test.demoset where test-bin equal 7”。
as_query query;as_query_init(&query, "test", "demoset");as_query_where_inita(&query, 1);as_query_where(&query, "test-bin", integer_equals(7));
注意:不帶“where"語句的查詢將導致全庫掃描。
調用查詢
查詢使用aerospike_query_foreach()函數調用。
此調用為叢集中每個節點初始化一個查詢任務。在C用戶端內部,有5個(NUM_QUERY_THREADS)查詢背景工作執行緒處理所有節點的查詢任務。若叢集多於5個節點,理想狀態下是增加預設的處理線程數,以便讓全部節點平行處理。
if (aerospike_query_foreach(&as, &err, NULL, &query, query_cb, NULL) != AEROSPIKE_OK) { LOG("aerospike_query_foreach() returned %d - %s", err.code, err.message); as_query_destroy(&query); cleanup(&as); exit(-1);}
若在指定的查詢目標上沒有建立次索引,將返回”AEROSPIKE_ERR_INDEX_NOT_FOUND“錯誤。若一個索引正在建立中,將返回AEROSPIKE_ERR_INDEX_NOT_READABLE錯誤。
處理結果
上面的樣本中,aerospike_query_foreach()函數使用了一個回呼函數query_cd做為參數。回呼函數具有如下型構:
typedef bool (*aerospike_query_foreach_callback)(const as_val *value, void *udata);
對任何節點返回的每條記錄,回呼函數都被調起,來對記錄進行處理。記錄處理沒有特定順序。你可能注意到參數value是個const as_val *類型,意味著回呼函數沒有責任銷毀它,它在回呼函數的範圍內可見。回呼函數不應將它傳遞到範圍之外。
沒有更多需處理的返回結果時,將以空值(NULL)做為參數value的值,調用回調用函數。
當參數value期望是一個記錄時,可簡單地使用as_record_formval()轉換成記錄類型。若參數value是個記錄,此函數返回一個記錄對象;否則返回空值。也可使用as_val_type()檢查value的類型。
bool callback(const as_val *value, void *udata) { if (value == NULL) { // query is complete return true; } as_record *rec = as_record_fromval(value); if (rec != NULL) { // process record } return true;}
若想在每次回調時傳遞一個全域對象出來,請在調用aerospike_query_foreach()時提供一個userdata類型的參數。
清理資源
一旦查詢結束,查詢對象與其成員對象可使用as_query_destroy()函數安全地釋放。注意在我們的樣本中,可以不用顯式調用as_query_destroy(),因為是從棧上分配的as_query對象,並且使用了as_query_where_inita(),來避免內部使用堆。
原文連結: http://www.aerospike.com/docs/client/c/usage/query/query.html譯 者:歪脖大肚子Q
Aerospike C用戶端手冊———查詢—查詢記錄