Hitachi

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


19.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のメモリ領域は,自動的に解放されません。メモリ領域の解放については,「19.1.1(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) keyまたはグループ指定による実行方法

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

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

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

また,ユーザファンクションに指定する引数を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で解放する必要がある関数を次の表に示します。次の表に示す各関数の解放対象(戻り値)がNULLでない場合は,戻り値を使用しなくなったタイミングで,メモリ領域を解放してください。

表19‒1 メモリ領域を解放する必要がある関数および解放対象となる戻り値

項番

関数名

解放対象となる戻り値

1

ead_get_cache_name()

キャッシュ名として返却されるchar型のポインタ

2

ead_put_all()

ead_put_all_results構造体のfailure_infoメンバ

3

ead_get()

ead_value_element構造体のvalueメンバ

4

ead_get_group()

ead_get_group_results構造体の次に示すメンバ

  • key_value_arrayメンバ

  • key_value_arrayメンバ内のead_key_value_pair構造体のkeyメンバ

  • key_value_arrayメンバ内のead_key_value_pair構造体内のead_value_element構造体のvalueメンバ

5

ead_get_all()

ead_get_all_results構造体の次に示すメンバ

  • valuesメンバ

  • valuesメンバ内のead_value_element構造体のvalueメンバ

  • failure_infoメンバ

6

ead_remove_all()

ead_remove_all_results構造体のfailure_infoメンバ

7

ead_get_group_names()

ead_group_names構造体のgroup_namesメンバ

8

ead_get_group_keys()

ead_keys構造体のkeysメンバ

9

ead_get_node_keys()

10

ead_get_group_first_key()

keyとして返却されたchar型のポインタ

11

ead_get_node_first_key()

12

ead_get_group_next_key()

13

ead_get_node_next_key()

14

ead_execute_function()

ユーザファンクションの実行結果として返却されたead_object構造体のobjectメンバ

15

ead_execute_function_rt()

16

ead_execute_node_function()

17

ead_execute_node_function_rt()

18

ead_get_nodelist()

ead_nodelist構造体のnodesメンバ

19

ead_get_slave_nodelist()

20

ead_add_cluster_eventlistener()

21

ead_add_node_eventlistener()