Hitachi

インメモリデータグリッド uCosminexus Elastic Application Data store ユーザーズガイド


21.1.1 キャッシュへのアクセスとデータ操作の流れ

キャッシュへのアクセスとデータ操作の流れについて説明します。

[図データ]

〈この項の構成〉

(1) C言語を使用する場合のソースプログラムの例

C言語を使用する場合のソースプログラムの例(keyとvalueを格納する場合)を次に示します。

#include <stdio.h>
#include <string.h>
 
#include <eads.h>
 
int main(int argc, char **argv) {
    int ret = 0;
    int error_code = 0;
    char CONFPATH[] = "./conf/eads_sample_client.properties";
    char CACHENAME[] = "cache1";
    char KEY[] = "key1";
    char VALUE[] = "value1";
    EAD_CACHE_MANAGER* cmp = NULL;
    EAD_CACHE *cp = NULL;
    ead_value_element value_element;
 
    value_element.value = (void *)VALUE;
    value_element.value_size = strlen(VALUE) + 1;
 
    /* EADsクライアントの初期設定をする */
    cmp = ead_init_client(CONFPATH, &error_code);
    printf("ead_init_client() done. (error_code = %d)\n", error_code);
    if (error_code != EAD_OK) {
        return 1;
    }
 
    /* キャッシュへのアクセスを開始する */
    cp = ead_start_cache(cmp, CACHENAME, &error_code);
    printf("ead_start_cache() done. (error_code = %d)\n", error_code);
    if (error_code != EAD_OK) {
        /* EADsクライアントを終了する場合 */
        goto ERR;
    }
 
    /* keyとvalueを格納する */
    ead_put(cp, KEY, &value_element, &error_code);
    printf("ead_put() done. (error_code = %d)\n", error_code);
    if (error_code != EAD_OK) {
        /* EADsクライアントを終了する場合 */
        goto ERR;
    }
 
    /* キャッシュへのアクセスを終了する */
    ead_stop_cache(cp, &error_code);
    cp = NULL;
    printf("ead_stop_cache() done. (error_code = %d)\n", error_code);
    if (error_code != EAD_OK) {
        /* EADsクライアントを終了する場合 */
        goto ERR;
    }
 
    /* EADsクライアントを終了する */
    ead_terminate_client(cmp, &error_code);
    cmp = NULL;
    printf("ead_terminate_client() done. (error_code = %d)\n", error_code);
    if (error_code != EAD_OK) {
        /* EADsクライアントを終了する場合 */
        goto ERR;
    }
 
    return 0;
 
ERR:
    if(cp != NULL) {
        /* キャッシュへのアクセスを終了する */
        ead_stop_cache(cp, &error_code);
        cp = NULL;
        printf("ead_stop_cache() done. (error_code = %d)\n", error_code);
    }
 
    if(cmp != NULL) {
        /* EADsクライアントを終了する */
        ead_terminate_client(cmp, &error_code);
        cmp = NULL;
        printf("ead_terminate_client() done. (error_code = %d)\n", error_code);
    }
 
    return 1;
}

(2) EADsクライアントの初期設定をする

EADsクライアントの初期設定をするには,ead_init_client()またはead_init_client_n()を使用します。また,キャッシュを管理するキャッシュマネージャのハンドル(ポインタ)を取得します。

クライアント定義に従って,接続先EADsサーバなどが設定されます。

複数のクラスタと同時に接続するなど,設定の異なる複数のキャッシュマネージャを同時に使用したい場合は,クライアント定義を変更してead_init_client()またはead_init_client_n()を複数回実行します。複数回実行した場合は,取得した各キャッシュマネージャのハンドルに対してead_terminate_client()を実行して,EADsクライアントを終了してください。

(3) キャッシュへのアクセスを開始する

EADsクライアントの初期設定が完了したら,キャッシュへのアクセスを開始します。

キャッシュへのアクセスを開始するには,ead_start_cache()を使用して,キャッシュへのアクセスを制御するためのハンドル(ポインタ)を取得します。このハンドルを使用することによって,キャッシュにアクセスできるようになります。

(4) keyとvalueを格納する

キャッシュにkeyとvalueを格納するには,ead_put()を使用します。

ead_put()には,ead_start_cache()で取得したキャッシュのハンドルを指定します。また,キャッシュに格納するkeyとvalue情報(valueとvalueのサイズ)を指定します。value情報はead_value_element構造体として用意します。

(5) valueを取得する

キャッシュからvalueを取得するには,ead_get()を使用します。

ead_get()には,ead_start_cache()で取得したキャッシュのハンドルを指定します。また,取得するvalueに関連づけられたkeyを指定します。

ead_get()によってvalueの取得が成功すると,keyに関連づけられたvalue情報がead_value_element構造体として返却されます。

なお,戻り値として返却されたvalueのメモリ領域は,自動的に解放されません。メモリ領域の解放については,「(10)戻り値として返却されたメモリ領域を解放する」を参照してください。

valueを取得する場合のソースプログラムの例を次に示します。

ソースプログラムの例(valueを取得する場合)

{
    /* valueを取得する */
    ead_value_element ret_value;
    char KEY[] = "key1";
    ret_value = ead_get(cp, KEY, &error_code);
    printf("ead_get() done. (error_code = %d)\n", error_code);
    if (error_code != EAD_OK) {
        /* EADsクライアントを終了する場合 */
        goto ERR;
    }
    /* 取得成功,取得したvalueは使用後に解放する */
    freeValue(&ret_value);
}

(6) keyとvalueを削除する

キャッシュから指定したkey,およびkeyに関連づけられたvalueを削除するには,ead_remove()を使用します。

ead_remove()には,ead_start_cache()で取得したキャッシュのハンドルを指定します。また,削除するvalueに関連づけられたkeyを指定します。

(7) ユーザファンクションを実行する

(a) グループ指定による実行方法

グループを指定してユーザファンクションを実行するには,ead_execute_function()を使用します。

ead_execute_function()には,ead_start_cache()で取得したキャッシュのハンドルを指定します。

また,ユーザファンクションを実行するグループ名と,実行するユーザファンクション名を指定します。

また,ユーザファンクションに指定する引数をead_object構造体として指定します。

ead_execute_function()によってユーザファンクションが実行されると,ユーザファンクションの実行結果がead_object構造体として返却されます。

(b) EADsサーバ指定による実行方法

EADsサーバを指定してユーザファンクションを実行するには,ead_execute_node_function()を使用します。

ead_execute_node_function()には,ead_start_cache()で取得したキャッシュのハンドルを指定します。

また,ユーザファンクションを実行するEADsサーバをead_node構造体として,ユーザファンクションに指定する引数をead_object構造体として指定します。

また,実行するユーザファンクション名を指定します。

ead_execute_node_function()によってユーザファンクションが実行されると,ユーザファンクションの実行結果がead_object構造体として返却されます。

(8) キャッシュへのアクセスを終了する

キャッシュへのアクセスを終了するには,ead_stop_cache()を使用します。

ead_stop_cache()には,ead_start_cache()で取得したキャッシュのハンドルを指定します。

(9) EADsクライアントを終了する

EADsクライアントを終了するには,ead_terminate_client()を使用します。

ead_terminate_client()には,ead_init_client()またはead_init_client_n()で取得したキャッシュマネージャのハンドルを指定します。

(10) 戻り値として返却されたメモリ領域を解放する

ead_get()の戻り値として返却されたvalueのメモリ領域は,自動的に解放されません。次のような関数を定義して,APで解放してください。

/* 戻り値として返却されたメモリ領域を解放する */
void freeValue(ead_value_element *value) {
    if (value->value != NULL) {
        free(value->value);
        value->value = NULL;
    }
    value->value_size = 0;
}

また,次の場合も同様に,メモリ領域をAPで解放してください。