C言語で memcached をいじってみる
C言語クライアントライブラリ libmemcached
C言語から memcached へデータを保存・取得してみる。
インストール
ソースからインストールする。
wget http://download.tangent.org/libmemcached-0.26.tar.gz
tar zvxf libmemcached-0.26.tar.gz
cd libmemcached-0.26.tar.gz
./configure
make
sudo make install
sudo ldconfig
libmemcached の使い方
man 3 libmemcached_examples
プログラムの雛型
#include <stdio.h>
#include <libmemcached/memcached.h>
int main(int argc, char *argv[]) {
    struct memcached_st *memc;
    memcached_return rc;
    memc = memcached_create(NULL);
    /* ここに memcached 的な処理 */
    memcached_free(memc);
    return 0;
}
サンプルコード
練習ついでに書いたコード (memc_server_add() が中途半端・・・)
#include<libmemcached/memcached.h>
/* default */
#define EXPIRE_TIME 600
/* memcached server list */
int memc_server_add(struct memcached_st *memc, char *host, int port);
/* memcached command function */
int memc_set(struct memcached_st *memc, char *key, char *value);
int memc_add(struct memcached_st *memc, char *key, char *value);
int memc_get(struct memcached_st *memc, char *key,
             size_t *value_length, uint32_t *flags, char *value);
int memc_del(struct memcached_st *memc, char *key);
/* echo memcached error message */
int memc_error(struct memcached_st *memc, memcached_return rc);
/* memcached server push */
int memc_server_add(struct memcached_st *memc, char *host, int port) {
    struct memcached_server_st *servers;
    memcached_return rc;
    servers = memcached_server_list_append(NULL, host, port, &rc);
    memc_error(memc, rc);
    rc = memcached_server_push(memc, servers);
    memc_error(memc, rc);
    memcached_server_list_free(servers);
    return 0;
}
/*
 *  SET [ key => value ] on memcached
 */
int memc_set(struct memcached_st *memc, char *key, char *value) {
    memcached_return rc;
    rc = memcached_set(memc,
                       key, strlen(key),
                       value, strlen(value),
                       (time_t)EXPIRE_TIME, (uint32_t)0);
    if (rc != MEMCACHED_BUFFERED) {
        return memc_error(memc, rc);
    }
    return 0;
}
/*
 *  ADD [ key => value ] on memcached when key is no exists
 */
int memc_add(struct memcached_st *memc, char *key, char *value) {
    memcached_return rc;
    rc = memcached_add(memc,
                       key, strlen(key),
                       value, strlen(value),
                       (time_t)EXPIRE_TIME, (uint32_t)0);
    if (rc != MEMCACHED_STORED) {
        return memc_error(memc, rc);
    }
    return 0;
}
/*
 *  GET [ key ] from memcached
 */
int memc_get(struct memcached_st *memc, char *key,
             size_t *value_length, uint32_t *flags, char *value) {
    memcached_return rc;
    char *received;
    received = memcached_get(memc, key, strlen(key),
                             value_length, flags, &rc);
    if (received != NULL) {
        strcpy(value, received);
    }
    return memc_error(memc, rc);
}
/*
 *  DELETE [ key => value ] from memcahed
 */
int memc_del(struct memcached_st *memc, char *key) {
    memcached_return rc;
    rc = memcached_delete(memc, key, strlen(key), (time_t)60);
    if (rc != MEMCACHED_BUFFERED) {
        return memc_error(memc, rc);
    }
    return 0;
}
/* check memcached error */
int memc_error(struct memcached_st *memc, memcached_return rc) {
    if (rc != MEMCACHED_SUCCESS) {
        fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
        return -1;
    }
    return 0;
}
サーバー接続からデータの保存・取得
基本的な使い方と一連の流れを書いてみた。
int main(int argc, char *argv[]) {
    struct memcached_st *memc;
    struct memcached_server_st *servers;
    memcached_return rc;
    memc = memcached_create(NULL);
    servers = memcached_server_list_append(NULL, "localhost", 11211, &rc);
    memc_error(memc, rc);
    rc = memcached_server_push(memc, servers);
    memc_error(memc, rc);
    memcached_server_list_free(servers);
    // SET
    char *key = "admin";
    char *value = "yulii";
    memc_set(memc, key, value);
    // GET
    char *get_data;
    get_data = (char *)malloc(1024 * sizeof(char));
    size_t value_length;
    uint32_t flags;
    memc_get(memc, key, &value_length, &flags, get_data);
    // print GET data
    fprintf(stderr, "Key: %s\n => Value: %s\n", key, get_data);
    //free(get_data);
    // DELETE
    memc_del(memc, key);
    // ADD
    key = "update";
    value = "new value!";
    memc_add(memc, key, value);
    int code;
    code = memc_get(memc, key, &value_length, &flags, get_data);
    if (code != -1) {
        fprintf(stderr, "Key: %s\n => Value: %s\n", key, get_data);
    }
    free(get_data);
    memcached_free(memc);
    return 0;
}