#include <stdio.h> #include <libmemcached/memcached.h> #include <libmemcached/util.h> #include < assert.h>//g++-m32-g Memcached_test.c-o memcached_test-i/usr/lib/libmemcached/include-l/usr/lib/libmemcached/ lib-lmemcached-lmemcachedutil//g++-m32-g Memcached_test.c-o memcached_test-i/usr/lib/libmemcached/include/usr/li B/libmemcached/lib/libmemcached.a/usr/lib/libmemcached/lib/libmemcachedutil.a//gcc-m32-std=gnu99-g Memcached_ Test.c-o memcached_test-i/usr/lib/libmemcached/include-l/usr/lib/libmemcached/lib/-lmemcached-lmemcached/lib/ libmemcachedutil//does not support gcc static chaining because the pool implementation is a C + + implementation//gcc-m32-g Memcached_test.c-o Memcached_test-i/usr/lib/libmemcache d/include/usr/lib/libmemcached/lib/libmemcached.a/usr/lib/libmemcached/lib/libmemcachedutil.a///usr/local/ Memcached-1.4.20/bin/memcached-d-M 10-u root-l 169.254.10.12-p 12111///usr/local/memcached-1.4.20/bin/memcached-d- M 10-root-l 169.254.10.12-p 12112///usr/local/memcached-1.4.20/bin/memcached-d-M 10-root-l 169.254.10.12-p 12113//http://libmemcached.org/libmemcached.html//Remove a connection cluster object from the connection pool, Support error code and timeout function Memcached_st * fetch_memcached_wait (Memcached_pool_st * pool, struct timespec* wait, memcached_return_t *RC) { ASSERT (Pool | | wait | | rc); Return Memcached_pool_fetch (pool, wait, RC);} Remove a connected Cluster object from the connection pool, no idle object directly returns Memcached_st * fetch_memcached (Memcached_pool_st * pool) {assert (pool); static struct Timespec wait = {0, 0}; Static memcached_return_t RC; Return fetch_memcached_wait (Pool, &wait, &RC);} Release a connection cluster object removed from the connection pool void release_memcached (Memcached_pool_st * pool, Memcached_st *memc) {assert (Pool | | memc); memcached_return_t rc = Memcached_pool_push (pool, MEMC); if (memcached_success! = RC) {//printf ("%s/n", Memcached_strerror (0, RC)); The}}//example program, which constructs a seed for a connection pool by configuration, constructs an object that is a cache cluster Memcached_st * CREATE_MEMCACHED_SEED_BY_CONFIG () {const char *config_string = "--server=169.254.10.12:12111/?1--server=169.254.10.12:12112/?2--server=169.254.10.12:12113--connect-timeout=10 "; memcached_return_t RC; Char errmsg[255] = {0}; rc = Libmemcached_check_configuration (config_string, strlen (config_string), errmsg, sizeof (errmsg)); Memcached_st *st = 0; if (memcached_success! = RC) {printf ("Check_configuration fail,%s.%s/n", ErrMsg, config_string); Return St; } Return st = memcached (config_string, strlen (config_string));} Example program, the seed of a connection pool constructed from a list of services, the object being constructed is a cache cluster Memcached_st * Create_memcached_seed_by_srv_list () {const char *hosts[] = {"16 9.254.10.12 "," 169.254.10.12 "," 169.254.10.12 "}; size_t port[] = {12111, 12112, 12113}; size_t weight[] = {1, 2, 1}; Memcached_server_list_st list = 0; bool result = true; size_t total = sizeof (weight)/sizeof (size_t); for (size_t i = 0; i < total; ++i) {memcached_return_t rc; List = Memcached_server_list_append_with_weight (list, hosts[i], port[i], weight[i], &RC); if (memcached_SUCCESS! = RC) {printf ("Server_list_append_with_weight fail,%s/n", memcached_strerror (0, RC)); result = false; Break }} Memcached_st *st = 0; if (result) {st = memcached_create (0); Memcached_server_push (St, list); printf ("memcached_server_list_count:%u/n", Memcached_server_list_count (list)); } if (list) {memcached_server_list_free (list); } return St;} Example program that constructs a pool of seeds directly through a service, constructs an object that is a cache cluster Memcached_st * CREATE_MEMCACHED_SEED_BY_HOST () {const char *hosts[] = {"169.25 4.10.12 "," 169.254.10.12 "," 169.254.10.12 "}; size_t port[] = {12111, 12112, 12113}; size_t weight[] = {1, 2, 1}; bool result = true; size_t total = sizeof (weight)/sizeof (size_t); Memcached_st *st = memcached_create (0); ASSERT (ST); for (size_t i = 0; i < total; ++i) {memcached_return_t rc; rc = Memcached_server_add_with_weight (St, Hosts[i], port[i], weight[i]);if (memcached_success! = RC) {printf ("Server_add_with_weight fail,%s/n", memcached_strerror (0, RC)); result = false; Break }} if (!result) {memcached_free (ST); st = 0; } else {printf ("memcached_server_count,%u/n", Memcached_server_count (ST)); } return St;} Example program that gets the configuration of a cache cluster void Get_memcached_config (Memcached_st *st) {assert (ST); uint64_t result = Memcached_behavior_get (St, memcached_behavior_remove_failed_servers); printf ("memcached_behavior_remove_failed_servers,%llu/n", result); result = Memcached_behavior_get (St, memcached_behavior_snd_timeout); printf ("memcached_behavior_snd_timeout,%llu/n", result); result = Memcached_behavior_get (St, Memcached_behavior_no_block); printf ("Memcached_behavior_no_block,%lld/n", result); result = Memcached_behavior_get (St, memcached_behavior_buffer_requests); printf ("memcached_behavior_buffer_requests,%llu/n", result); ResUlt = Memcached_behavior_get (St, memcached_behavior_connect_timeout); printf ("memcached_behavior_connect_timeout,%llu/n", result); result = Memcached_behavior_get (St, Memcached_behavior_server_failure_limit); printf ("memcached_behavior_server_failure_limit,%llu/n", result);} Example program, setting the configuration of a cache cluster void Set_memcached_config (Memcached_st *st) {assert (ST); memcached_return_t RC; rc = Memcached_behavior_set (St, Memcached_behavior_no_block, 1); if (memcached_success! = RC) {printf ("Set Memcached_behavior_no_block fail,%s/n", Memcached_strerror (St, RC)); rc = Memcached_behavior_set (St, memcached_behavior_rcv_timeout, 1000 * 1000 * 3); if (memcached_success! = RC) {printf ("Set Memcached_behavior_rcv_timeout fail,%s/n", Memcached_strerror (St, RC) ); }}//Example Program, get the configuration of a cluster pool void Get_memcached_pool_config (Memcached_pool_st *pool) {assert (pool); uint64_t result = 0; memcached_return_t RC; rc = Memcached_pool_behavior_get (pool, memcached_Behavior_no_block, &result); printf ("Memcached_behavior_no_block,%llu/n", result); rc = Memcached_pool_behavior_get (pool, memcached_behavior_buffer_requests, &result); printf ("memcached_behavior_buffer_requests,%llu/n", result); rc = Memcached_pool_behavior_get (pool, memcached_behavior_connect_timeout, &result); printf ("memcached_behavior_connect_timeout,%llu/n", result); rc = Memcached_pool_behavior_get (pool, memcached_behavior_server_failure_limit, &result); printf ("memcached_behavior_server_failure_limit,%llu/n", result); rc = Memcached_pool_behavior_get (pool, memcached_behavior_snd_timeout, &result); printf ("memcached_behavior_snd_timeout,%llu/n", result); rc = Memcached_pool_behavior_get (pool, memcached_behavior_rcv_timeout, &result); printf ("memcached_behavior_rcv_timeout,%llu/n", result); rc = Memcached_pool_behavior_get (pool, memcached_behavior_remove_failed_servers, &result); printf ("Memcached_behavior_remove_failed_servers,%llu/n ", result);} Example program, set the configuration of a cluster pool bool Set_memcached_pool_config (Memcached_pool_st *pool) {assert (pool); memcached_return_t RC; rc = Memcached_pool_behavior_set (pool, memcached_behavior_snd_timeout, 1000 * 1000 * 3); if (memcached_success! = RC) {printf ("Memcached_behavior_snd_timeout fail,%s/n", memcached_strerror (0, RC)); rc = Memcached_pool_behavior_set (pool, memcached_behavior_rcv_timeout, 1000 * 1000 * 4); if (memcached_success! = RC) {printf ("Memcached_behavior_rcv_timeout fail,%s/n", memcached_strerror (0, RC)); rc = Memcached_pool_behavior_set (pool, memcached_behavior_remove_failed_servers, 3); if (memcached_success! = RC) {printf ("Memcached_behavior_remove_failed_servers fail,%s/n", Memcached_strerror (0 , RC)); }}//Example program, get the value of multiple keys at once void mget_memcached (Memcached_st *st, const char *keys[], size_t key_length[], size_t key_count) {A Ssert (St | | keys | | key_length > 0 | | key_count > 0); Uint32_t count = 0, flags = 0; Char Return_key[memcached_max_key] = {0}; size_t Return_key_length; char *return_value = 0; size_t Return_value_length; memcached_return_t rc = Memcached_mget (st, Keys, Key_length, Key_count); while (Return_value = Memcached_fetch (St, Return_key, &return_key_length, & Amp;return_value_length, &flags, &RC)) {count++; printf ("key=%s,keylength=%u,value=%s,total=%u/n", Return_key, Return_key_length, Return_value, Count); Free (return_value); memset (return_key, 0, sizeof (return_key)); }}//Example program, once get the value of specifying a key void Get_memcached_by_key (Memcached_st *st, const char *key, size_t key_length) {assert (St | | key || Key_length > 0); uint32_t flags = 0, value_length = 0; memcached_return_t RC; Char *value = memcached_get (St, Key, Key_length, &value_length, &flags, &RC); if (memcached_success! = RC) {printf ("%s/n", memcacheD_strerror (St, RC)); } else {printf ("key=%s,key_length=%u,value=%s,value_length=%u/n", Key, Key_length, value, value_length); Free (value); }}//complete test program int main (int argc, char *argv{printf ("memcached_lib_version:%s/n", Memcached_lib_version ()); Get a cluster seed, three methods the purpose and function are the same, optionally a memcached_st * MEMC = Create_memcached_seed_by_host (); Memcached_st * MEMC = Create_memcached_seed_by_srv_list (); Memcached_st * MEMC = Create_memcached_seed_by_config (); ASSERT (MEMC); Set the cluster seed properties Set_memcached_config (MEMC); Get_memcached_config (MEMC); printf ("----------/n"); Create cluster pool, release cluster pool, automatically free all resources (including seed) const uint32_t INITIAL = 1, MAX = 4; Memcached_pool_st *pool = memcached_pool_create (MEMC, INITIAL, MAX); ASSERT (pool); Sets the cluster seed's attribute set_memcached_pool_config (pool); Get_memcached_pool_config (pool); printf ("----------/n"); Remove a cluster Access object from the cluster pool struct Timespec spec = {3, 0}; memcached_return_t RC; MEMC = Fetch_memcached_wait (POol, &spec, &RC); if (memcached_success! = RC) {printf ("fetch_memcached fail,%s/n", memcached_strerror (0, RC)); Memcached_pool_destroy (pool); return 0; } const char *keys[] = {"P", "1", "2", "3", "A", "#", "^", "*", "&", ",", "?"}; size_t key_length[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; const char *values[] = {"11111", "222b2", "33333", "AAAA", "PPO1", "oo#", "^WW", "* * *", "&&&", ",,,", "????? " }; size_t i = 0, total = sizeof (keys)/sizeof (char *); while (MEMC && total > i) {//Set multiple values, scatter stored in multiple services rc = Memcached_set (MEMC, Keys[i], strlen (keys[i ]), Values[i], strlen (values[i]), 0, 0); if (memcached_success! = RC) {printf ("%s,%d/n", Memcached_strerror (MEMC, RC), i); } i++; } if (MEMC) {//frees the removed cluster Access object release_memcached (pool, MEMC); }//No blocking, take out an Access object MEMC = fetch_memcached (pool); Use different ways to access Object mget_memcached (MEMC,Keys, key_length, sizeof (keys)/sizeof (char *)); printf ("----------/n"); Mget_memcached (Memc,keys, key_length, sizeof (keys)/sizeof (char *)); Get_memcached_by_key (MEMC, keys[10], strlen (keys[10])); Get_memcached_by_key (MEMC, keys[4], strlen (keys[4])); Get_memcached_by_key (MEMC, keys[3], strlen (keys[3])); if (MEMC) {//frees the removed cluster Access object release_memcached (pool, MEMC); }//cluster pool release, automatic release of all resources (including seed) Memcached_pool_destroy (pool); memcached_return_t rc = Memcached_notfound; printf ("aa=%s/n", Memcached_strerror (0, RC)); printf ("over./n"); return 0;}
Libmemcached supports connection pooling access memcached