16.6.3.3 C 및 C ++에서 libmemcached
사용
libmemcached
라이브러리는 memcached에 대한 C 및 C ++ 인터페이스를 제공하고 여러 가지 추가 API 구현 (Perl, Python, Ruby 포함)의 토대도 제공합니다. libmemcached
의 핵심 기능을 이해하는 것은 이러한 다른 인터페이스를 사용하면 도움이됩니다. C 라이브러리는 memcached의 가장 포괄적 인 인터페이스 라이브러리이며, libmemcached
라이브러리를 기반으로하지 않는 인터페이스에서는 상시 공개되지 않은 함수와 조작 시스템을 제공합니다.
다양한 함수를 그 기본 조작에 따라 분류 할 수 있습니다. 코어 API로 인터페이스되는 함수 이외에 몇 가지 유틸리티 함수에 의해 확장 기능 (데이터의 말미에 추가하거나 위로의 추가 등)가 제공됩니다.
libmemcached
를 빌드하고 설치하려면 libmemcached
패키지를 다운로드하여 configure를 실행 한 후 빌드 및 설치합니다.
shell> tar xjf libmemcached-0.21.tar.gz shell> cd libmemcached-0.21 shell> ./configure shell> make shell> make install
많은 Linux 운영 체제에서는 일반 yum, apt-get 또는 이와 유사한 명령을 사용하면 해당 libmemcached
패키지를 설치할 수 있습니다.
이 라이브러리를 사용하는 응용 프로그램을 빌드하려면 먼저 서버 목록을 설정합니다. memcached_st
주요 구조체 내부에 구성된 서버를 직접 조작하거나 서버 목록을 별도로 이입하거나하여 그 목록을 memcached_st
구조에 추가합니다. 다음 예제에서는 후자의 방법을 사용하고 있습니다. 서버 목록을 설정 한 후에는 함수를 호출하여 데이터를 저장하거나 검색 할 수 있습니다. 사전 설정 값을 localhost
로 설정하는 간단한 응용 프로그램을 여기에 나타냅니다.
#include <stdio.h> #include <string.h> #include <unistd.h> #include <libmemcached/memcached.h> int main(int argc, char *argv[]) { memcached_server_st *servers = NULL; memcached_st *memc; memcached_return rc; char *key= "keystring"; char *value= "keyvalue"; memcached_server_st *memcached_servers_parse (char *server_strings); memc= memcached_create(NULL); servers= memcached_server_list_append(servers, "localhost", 11211, &rc); rc= memcached_server_push(memc, servers); if (rc == MEMCACHED_SUCCESS) fprintf(stderr,"Added server successfully\n"); else fprintf(stderr,"Couldn't add server: %s\n",memcached_strerror(memc, rc)); rc= memcached_set(memc, key, strlen(key), value, strlen(value), (time_t)0, (uint32_t)0); if (rc == MEMCACHED_SUCCESS) fprintf(stderr,"Key stored successfully\n"); else fprintf(stderr,"Couldn't store key: %s\n",memcached_strerror(memc, rc)); return 0; }
조작이 성공했는지 여부를 테스트하려면 특정 함수의 반환 값 (또는 이입 된 결과 코드)를 사용합니다. 조작이 성공했을 경우,이 값은 항상 MEMCACHED_SUCCESS
로 설정됩니다. 오류가 발생한 경우 memcached_strerror()
함수를 사용하여 결과 코드를 출력 가능한 문자열로 변환합니다.
응용 프로그램을 빌드하려면 memcached
라이브러리를 지정합니다.
shell> gcc -o memc_basic memc_basic.c -lmemcached
memcached 서버를 시작한 후 위의 샘플 응용 프로그램을 실행하면 성공 메시지가 반환됩니다.
shell> memc_basic Added server successfully Key stored successfully
16.6.3.3.1 libmemcached
의 기반 함수
libmemcached
의 기반 함수를 사용하면 memcached
서버와의 인터페이스로 사용되는 memcached_st
주요 구조체를 생성, 파괴 및 복제 할 수 있습니다. 주요 함수의 정의를 보여줍니다.
memcached_st *memcached_create (memcached_st *ptr);
다른 libmemcached
API 함수에서 사용하는 새로운 memcached_st
구조를 만듭니다. 기존의 정적 memcached_st
구조를 지정하거나 NULL
을 지정해 새로운 구조체를 할당 할 수 있습니다. 생성 된 구조체에 대한 포인터를 반환합니다. 실패시 NULL
을 반환합니다.
void memcached_free (memcached_st *ptr);
이전에 작성된 memcached_st
구조체에 할당 된 구조체와 메모리를 해제합니다.
memcached_st *memcached_clone(memcached_st *clone, memcached_st *source);
지정된 source
에서 기존 memcached
구조를 복제하고 그 구조체에 정의되어있는 기본 및 서버 목록을 복사합니다.
16.6.3.3.2 libmemcached
서버 함수
libmemcached
API는 memcached_server_st
구조에 저장되어있는 서버 목록을 사용하여 나머지 함수에서 사용되는 서버 목록 역할을합니다. memcached
를 사용하려면 먼저 서버 목록을 만든 다음 해당 서버 목록을 유효한 libmemcached
객체에 적용합니다.
이 서버 목록과 활성 libmemcached
개체의 서버 목록은 별도로 조작 할 수 있기 때문에 활성 libmemcached
인터페이스를 실행하는 동안 서버 목록을 업데이트하고 관리 할 수 있습니다.
memcached_st
구조의 서버 목록을 조작하는 함수는 다음과 같습니다.
memcached_return memcached_server_add (memcached_st *ptr, char *hostname, unsigned int port);
지정된 hostname
과 port
를 사용하여 ptr
에 지정된 memcached_st
구조에 서버를 추가합니다.
memcached_return memcached_server_add_unix_socket (memcached_st *ptr, char *socket);
memcached_st
구조로 구성된 서버 목록에 Unix 소켓을 추가합니다.
unsigned int memcached_server_count (memcached_st *ptr);
memcached_st
구조에 포함되어 구성된 서버의 카운트를 돌려줍니다.
memcached_server_st * memcached_server_list (memcached_st *ptr);
memcached_st
구조에 포함 된 미리 정의 된 호스트의 배열을 돌려줍니다.
memcached_return memcached_server_push (memcached_st *ptr, memcached_server_st *list);
현재 memcached_st
구조로 구성되어있는 서버 목록에 기존 서버 목록을 푸시합니다. 이렇게하면 기존리스트의 말미에 서버가 추가되지만 중복은 확인하지 않습니다.
memcached_server_st
구조를 사용하여 memcached
서버의 목록을 만들고 그들을 memcached_st
구조에 개별적으로 적용 할 수 있습니다.
memcached_server_st * memcached_server_list_append (memcached_server_st *ptr, char *hostname, unsigned int port, memcached_return *error);
hostname
과 port
를 사용하여 ptr
의 서버 목록에 서버를 추가합니다. 결과 코드는 error
인자에 의해 처리됩니다. 이 인수는 기존 memcached_return
변수를 말합니다. 이 함수는 반환 된 목록에 대한 포인터를 반환합니다.
unsigned int memcached_server_list_count (memcached_server_st *ptr);
서버 목록에서 서버 수를 돌려줍니다.
void memcached_server_list_free (memcached_server_st * ptr);
서버 목록에 연결된 메모리를 해제합니다.
memcached_server_st *memcached_servers_parse (char *server_strings);
서버 목록을 포함하는 문자열을 해석합니다. 각 서버는 쉼표, 공백, 또는 둘 모두로 구분 개별 서버는
형식으로되어 있습니다. 반환 값은 서버 목록 구조입니다. server
[: port
]
16.6.3.3.3 libmemcached
설정 함수
libmemcached
의 설정 관련 함수는 memcached
프로토콜에서 지원하는 코어 함수와 동일한 기능을 제공합니다. 각종 함수의 완전한 정의는 모든 기반 함수 ( add
, replace
, prepend
, append
)와 동일합니다. 예를 들어, memcached_set()
함수 정의는 다음과 같습니다.
memcached_return memcached_set (memcached_st *ptr, const char *key, size_t key_length, const char *value, size_t value_length, time_t expiration, uint32_t flags);
ptr
은 memcached_st
구조입니다. key
와 key_length
은 키의 이름과 길이를 정의하고 value
와 value_length
는 해당 값과 길이를 정의합니다. 취소 및 옵션 플래그를 설정할 수도 있습니다. 자세한 내용은 섹션 16.6.3.3.5 " libmemcached
의 동작 제어 " 를 참조하십시오.
이 표는 libmemcached
의 나머지 설정 관련 함수와 memcached 프로토콜에서 지원되는 동일한 코어 함수의 개요를 나타냅니다.
libmemcached 함수 | 동일한 코어 함수 |
---|---|
memcached_set(memc, key, key_length, value, value_length, expiration, flags) | 일반 set() 조작. |
memcached_add(memc, key, key_length, value, value_length, expiration, flags) | 일반 add() 함수. |
memcached_replace(memc, key, key_length, value, value_length, expiration, flags) | 일반 replace() . |
memcached_prepend(memc, key, key_length, value, value_length, expiration, flags) | 지정된 value 를 지정된 key 의 현재 값 앞에 추가합니다. |
memcached_append(memc, key, key_length, value, value_length, expiration, flags) | 지정된 value 를 지정된 key 의 현재 값 뒤에 추가합니다. |
memcached_cas(memc, key, key_length, value, value_length, expiration, flags, cas) | 서버에서 해당 cas 값이 같은 경우는 특정 키의 데이터를 덮어 씁니다. |
memcached_set_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags) | 일반 set() 와 거의 동일하지만, 개별 서버를 식별하는 데 사용할 수있는 추가 마스터 키 옵션을 제공합니다. |
memcached_add_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags) | 일반 add() 와 거의 동일하지만, 개별 서버를 식별하는 데 사용할 수있는 추가 마스터 키 옵션을 제공합니다. |
memcached_replace_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags) | 일반 replace() 와 거의 동일하지만, 개별 서버를 식별하는 데 사용할 수있는 추가 마스터 키 옵션을 제공합니다. |
memcached_prepend_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags) | memcached_prepend() 와 거의 동일하지만, 개별 서버를 식별하는 데 사용할 수있는 추가 마스터 키 옵션을 제공합니다. |
memcached_append_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags) | memcached_append() 와 거의 동일하지만, 개별 서버를 식별하는 데 사용할 수있는 추가 마스터 키 옵션을 제공합니다. |
memcached_cas_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags) | memcached_cas() 와 거의 동일하지만, 개별 서버를 식별하는 데 사용할 수있는 추가 마스터 키 옵션을 제공합니다. |
by_key
메소드는 서버 선택의 해시 단계에서 사용 및 적용되는 마스터 키를 정의하는 두 개의 인수가 추가되어 있습니다. 이것은 다음의 정의에서 확인할 수 있습니다.
memcached_return memcached_set_by_key(memcached_st *ptr, const char *master_key, size_t master_key_length, const char *key, size_t key_length, const char *value, size_t value_length, time_t expiration, uint32_t flags);
모든 함수가 MEMCACHED_SUCCESS
상수와 비교할 수 memcached_return
형의 값을 돌려줍니다.
16.6.3.3.4 libmemcached
의 취득 함수
libmemcached
함수는 하나의 항목에 직접 액세스와 여러 키를 동시에 가져올 때 응답이 매우 빠르게 여러 키 요청 메커니즘을 제공합니다.
일반 get()
과 동등한 주요 get 스타일의 함수는 memcached_get()
입니다. 이 함수는 지정된 키에 관련 지을 수 있었던 값을 가리키는 문자열 포인터를 반환합니다.
char *memcached_get (memcached_st *ptr, const char *key, size_t key_length, size_t *value_length, uint32_t *flags, memcached_return *error);
여러 키 get이다 memcached_mget()
도 사용 가능합니다. 여러 키 가져 오기 작업을 사용하면 memcached_get()
를 개별적으로 호출하여 키 값을 검색하는 것보다 1 블록의 작업을 매우 빠르게 수행 할 수 있습니다. 여러 키 검색을 시작하려면 memcached_mget()
를 호출합니다.
memcached_return memcached_mget (memcached_st *ptr, char **keys, size_t *key_length, unsigned int number_of_keys);
반환 값은 작업의 성공입니다. keys
매개 변수는 키를 포함하는 문자열 배열 key_length
대응하는 각 키의 길이를 포함한 배열입니다. number_of_keys
배열에 설정 한 키의 수입니다.
개별 값을 페치하려면 memcached_fetch()
를 사용하여 대응하는 각 값을 가져옵니다.
char *memcached_fetch (memcached_st *ptr, const char *key, size_t *key_length, size_t *value_length, uint32_t *flags, memcached_return *error);
이 함수는 키 값을 돌려주고, key
, key_length
및 value_length
매개 변수에 해당하는 키와 길이 정보를 채 웁니다. 이 함수는 반환 값이 없어 졌을 때에 NULL
을 반환합니다. 키 데이터의 이입과 정보의 반환을 포함하여 완전한 예를 여기에 나와 있습니다.
#include <stdio.h> #include <sstring.h> #include <unistd.h> #include <libmemcached/memcached.h> int main(int argc, char *argv[]) { memcached_server_st *servers = NULL; memcached_st *memc; memcached_return rc; char *keys[]= {"huey", "dewey", "louie"}; size_t key_length[3]; char *values[]= {"red", "blue", "green"}; size_t value_length[3]; unsigned int x; uint32_t flags; char return_key[MEMCACHED_MAX_KEY]; size_t return_key_length; char *return_value; size_t return_value_length; memc= memcached_create(NULL); servers= memcached_server_list_append(servers, "localhost", 11211, &rc); rc= memcached_server_push(memc, servers); if (rc == MEMCACHED_SUCCESS) fprintf(stderr,"Added server successfully\n"); else fprintf(stderr,"Couldn't add server: %s\n",memcached_strerror(memc, rc)); for(x= 0; x < 3; x++) { key_length[x] = strlen(keys[x]); value_length[x] = strlen(values[x]); rc= memcached_set(memc, keys[x], key_length[x], values[x], value_length[x], (time_t)0, (uint32_t)0); if (rc == MEMCACHED_SUCCESS) fprintf(stderr,"Key %s stored successfully\n",keys[x]); else fprintf(stderr,"Couldn't store key: %s\n",memcached_strerror(memc, rc)); } rc= memcached_mget(memc, keys, key_length, 3); if (rc == MEMCACHED_SUCCESS) { while ((return_value= memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc)) != NULL) { if (rc == MEMCACHED_SUCCESS) { fprintf(stderr,"Key %s returned %s\n",return_key, return_value); } } } return 0; }
위의 응용 프로그램을 실행하면 다음과 같은 출력이 생성됩니다.
shell> memc_multi_fetch Added server successfully Key huey stored successfully Key dewey stored successfully Key louie stored successfully Key huey returned red Key dewey returned blue Key louie returned green
16.6.3.3.5 libmemcached
의 동작 제어
libmemcached
동작은 하나 이상의 동작 플래그를 설정하여 변경할 수 있습니다. 이들은 글로벌로 설정하거나 개별 함수를 호출하는 동안 적용 할 수 있습니다. 서버 선택시 사용되는 해시 메커니즘 등 추가 설정을 적용 동작도 있습니다.
글로벌 동작을 설정하려면 :
memcached_return memcached_behavior_set (memcached_st *ptr, memcached_behavior flag, uint64_t data);
현재 동작 설정을 얻으려면 :
uint64_t memcached_behavior_get (memcached_st *ptr, memcached_behavior flag);
libmemcached
동작 플래그를 다음 표에 나타냅니다.
동작 | 설명 |
---|---|
MEMCACHED_BEHAVIOR_NO_BLOCK | libmemcached 에서 비동기 I / O를 사용합니다. |
MEMCACHED_BEHAVIOR_TCP_NODELAY | 이 네트워크 소켓을 NODELAY을 선택합니다. |
MEMCACHED_BEHAVIOR_HASH | 값이없는 경우는 MD5를 사용하여 키의 기본 해시 알고리즘을 설정합니다. 다른 유효한 값으로 MEMCACHED_HASH_DEFAULT , MEMCACHED_HASH_MD5 , MEMCACHED_HASH_CRC , MEMCACHED_HASH_FNV1_64 , MEMCACHED_HASH_FNV1A_64 , MEMCACHED_HASH_FNV1_32 및 MEMCACHED_HASH_FNV1A_32 수 있습니다. |
MEMCACHED_BEHAVIOR_DISTRIBUTION | 특정 값을 저장하는 데 사용되는 서버의 선택 방법을 변경합니다. 기본 방법은 MEMCACHED_DISTRIBUTION_MODULA 입니다. 일관성 해시를 사용하려면 MEMCACHED_DISTRIBUTION_CONSISTENT 을 설정합니다. MEMCACHED_DISTRIBUTION_CONSISTENT 값 MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA 의 별칭입니다. |
MEMCACHED_BEHAVIOR_CACHE_LOOKUPS | DNS 서비스에 대해 수행 된 조회를 캐시합니다. 개별 호스트에 IP 주소 대신 이름을 사용하는 경우, 이는 성능을 향상시킬 수 있습니다. |
MEMCACHED_BEHAVIOR_SUPPORT_CAS | CAS 작업을 지원합니다. 성능이 저하되기 때문에 기본적으로이 무효가되어 있습니다. |
MEMCACHED_BEHAVIOR_KETAMA | 기본 분포를 MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA 로 설정하고 해시를 MEMCACHED_HASH_MD5 로 설정합니다. |
MEMCACHED_BEHAVIOR_POLL_TIMEOUT | poll() 에서 사용되는 타임 아웃 값을 변경합니다. 시간 제한 값은 signed int 포인터를 지정합니다. |
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS | I / O 요청을 보내지 않고 버퍼링합니다. 이 데이터는 검색 작업 또는 연결 닫기에 의해 플래시됩니다. |
MEMCACHED_BEHAVIOR_VERIFY_KEY | 지정된 키가 유효한지 여부를 libmemcached 가 강제로 검증합니다. |
MEMCACHED_BEHAVIOR_SORT_HOSTS | 설정하면 memcached_st 구조 구성된 호스트 목록에 추가 된 호스트가 정렬 된 순서로 호스트 목록에 배치됩니다. 그러면 일관성 해시가 활성화되어있는 경우는 그 동작이 취소됩니다. |
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT | 비 블록 모드에서는이를 통해 소켓 연결 중 시간 초과 값이 변경됩니다. |
16.6.3.3.6 libmemcached 명령 행 유틸리티
libmemcached
에는 주요 C 라이브러리 인터페이스뿐만 아니라, memcached 응용 프로그램의 조작이나 디버깅에 도움이되는 몇 가지 명령 행 유틸리티가 포함되어 있습니다.
모든 명령 줄 도구는 몇 가지 인수를 허용하지만 그 중 가장 중요한 것은 정보를 반환 할 때 연결할 서버의 목록을 지정 servers
입니다.
주요 도구는 다음과 같습니다.
memcat : 지정된 각 ID 값을 명령 행에 표시합니다.
shell> memcat --servers=localhost hwkey Hello world
memcp : 파일 이름을 키로 사용하여 파일의 내용을 캐시에 복사합니다.
shell> echo "Hello World" > hwkey shell> memcp --servers=localhost hwkey shell> memcat --servers=localhost hwkey Hello world
memrm : 캐시에서 항목을 제거합니다.
shell> memcat --servers=localhost hwkey Hello world shell> memrm --servers=localhost hwkey shell> memcat --servers=localhost hwkey
memslap : 취득 / 설정 및 여러 클라이언트의 동작을 시뮬레이션하여 하나 이상의 memcached 서버에 대한 부하를 테스트합니다. 예를 들어, 검색 작업을 수행하는 100 대의 클라이언트의 부하를 시뮬레이션 할 수 있습니다.
shell> memslap --servers=localhost --concurrency=100 --flush --test=get memslap --servers=localhost --concurrency=100 --flush --test=get Threads connecting to servers 100 Took 13.571 seconds to read data
memflush : memcached 캐시의 내용을 플래시 (하늘에)합니다.
shell> memflush --servers=localhost