Using libmemcached with C and C++
来源:互联网 发布:郑州it公司 编辑:程序博客网 时间:2024/05/17 03:29
15.6.3.3 Using libmemcached
with C and C++
- 15.6.3.3.1
libmemcached
Base Functions - 15.6.3.3.2
libmemcached
Server Functions - 15.6.3.3.3
libmemcached
Set Functions - 15.6.3.3.4
libmemcached
Get Functions - 15.6.3.3.5 Controlling
libmemcached
Behaviors - 15.6.3.3.6 libmemcached Command-Line Utilities
The libmemcached
library provides both C and C++ interfaces to memcached and is also the basis for a number of different additional API implementations, including Perl, Python and Ruby. Understanding the corelibmemcached
functions can help when using these other interfaces.
The C library is the most comprehensive interface library for memcached and provides functions and operational systems not always exposed in interfaces not based on the libmemcached
library.
The different functions can be divided up according to their basic operation. In addition to functions that interface to the core API, a number of utility functions provide extended functionality, such as appending and prepending data.
To build and install libmemcached
, download the libmemcached
package, run configure, and then build and install:
shell> tar xjf libmemcached-0.21.tar.gzshell> cd libmemcached-0.21shell> ./configureshell> makeshell> make install
On many Linux operating systems, you can install the corresponding libmemcached
package through the usualyum, apt-get, or similar commands.
To build an application that uses the library, first set the list of servers. Either directly manipulate the servers configured within the main memcached_st
structure, or separately populate a list of servers, and then add this list to the memcached_st
structure. The latter method is used in the following example. Once the server list has been set, you can call the functions to store or retrieve data. A simple application for setting a preset value tolocalhost
is provided here:
#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;}
To test the success of an operation, use the return value, or populated result code, for a given function. The value is always set to MEMCACHED_SUCCESS
if the operation succeeded. In the event of a failure, use thememcached_strerror()
function to translate the result code into a printable string.
To build the application, specify the memcached
library:
shell> gcc -o memc_basic memc_basic.c -lmemcached
Running the above sample application, after starting a memcached server, should return a success message:
shell> memc_basicAdded server successfullyKey stored successfully
15.6.3.3.1 libmemcached
Base Functions
The base libmemcached
functions let you create, destroy and clone the main memcached_st
structure that is used to interface with the memcached
servers. The main functions are defined below:
memcached_st *memcached_create (memcached_st *ptr);
Creates a new memcached_st
structure for use with the other libmemcached
API functions. You can supply an existing, static, memcached_st
structure, or NULL
to have a new structured allocated. Returns a pointer to the created structure, or NULL
on failure.
void memcached_free (memcached_st *ptr);
Frees the structure and memory allocated to a previously created memcached_st
structure.
memcached_st *memcached_clone(memcached_st *clone, memcached_st *source);
Clones an existing memcached
structure from the specified source
, copying the defaults and list of servers defined in the structure.
15.6.3.3.2 libmemcached
Server Functions
The libmemcached
API uses a list of servers, stored within the memcached_server_st
structure, to act as the list of servers used by the rest of the functions. To use memcached
, you first create the server list, and then apply the list of servers to a valid libmemcached
object.
Because the list of servers, and the list of servers within an active libmemcached
object can be manipulated separately, you can update and manage server lists while an active libmemcached
interface is running.
The functions for manipulating the list of servers within a memcached_st
structure are:
memcached_return memcached_server_add (memcached_st *ptr, char *hostname, unsigned int port);
Adds a server, using the given hostname
and port
into the memcached_st
structure given in ptr
.
memcached_return memcached_server_add_unix_socket (memcached_st *ptr, char *socket);
Adds a Unix socket to the list of servers configured in the memcached_st
structure.
unsigned int memcached_server_count (memcached_st *ptr);
Returns a count of the number of configured servers within the memcached_st
structure.
memcached_server_st * memcached_server_list (memcached_st *ptr);
Returns an array of all the defined hosts within a memcached_st
structure.
memcached_return memcached_server_push (memcached_st *ptr, memcached_server_st *list);
Pushes an existing list of servers onto list of servers configured for a current memcached_st
structure. This adds servers to the end of the existing list, and duplicates are not checked.
The memcached_server_st
structure can be used to create a list of memcached
servers which can then be applied individually to memcached_st
structures.
memcached_server_st * memcached_server_list_append (memcached_server_st *ptr, char *hostname, unsigned int port, memcached_return *error);
Adds a server, with hostname
and port
, to the server list in ptr
. The result code is handled by the error
argument, which should point to an existing memcached_return
variable. The function returns a pointer to the returned list.
unsigned int memcached_server_list_count (memcached_server_st *ptr);
Returns the number of the servers in the server list.
void memcached_server_list_free (memcached_server_st *ptr);
Frees the memory associated with a server list.
memcached_server_st *memcached_servers_parse (char *server_strings);
Parses a string containing a list of servers, where individual servers are separated by a comma, space, or both, and where individual servers are of the form
. The return value is a server list structure.server
[:port
]
15.6.3.3.3 libmemcached
Set Functions
The set-related functions within libmemcached
provide the same functionality as the core functions supported by the memcached
protocol. The full definition for the different functions is the same for all the base functions (add
,replace
, prepend
, append
). For example, the function definition for memcached_set()
is:
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);
The ptr
is the memcached_st
structure. The key
and key_length
define the key name and length, and value
and value_length
the corresponding value and length. You can also set the expiration and optional flags. For more information, see Section 15.6.3.3.5, “Controlling libmemcached
Behaviors”.
This table outlines the remainder of the set-related libmemcached
functions and the equivalent core functions supported by the memcached protocol.
libmemcached
Functionmemcached_set(memc, key, key_length, value, value_length, expiration, flags)
Generic set()
operation.memcached_add(memc, key, key_length, value, value_length, expiration, flags)
Generic add()
function.memcached_replace(memc, key, key_length, value, value_length, expiration, flags)
Generic replace()
.memcached_prepend(memc, key, key_length, value, value_length, expiration, flags)
Prepends the specified value
before the current value of the specified key
.memcached_append(memc, key, key_length, value, value_length, expiration, flags)
Appends the specified value
after the current value of the specified key
.memcached_cas(memc, key, key_length, value, value_length, expiration, flags, cas)
Overwrites the data for a given key as long as the corresponding cas
value is still the same within the server.memcached_set_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the generic set()
, but has the option of an additional master key that can be used to identify an individual server.memcached_add_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the generic add()
, but has the option of an additional master key that can be used to identify an individual server.memcached_replace_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the generic replace()
, but has the option of an additional master key that can be used to identify an individual server.memcached_prepend_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the memcached_prepend()
, but has the option of an additional master key that can be used to identify an individual server.memcached_append_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the memcached_append()
, but has the option of an additional master key that can be used to identify an individual server.memcached_cas_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the memcached_cas()
, but has the option of an additional master key that can be used to identify an individual server.The by_key
methods add two further arguments that define the master key, to be used and applied during the hashing stage for selecting the servers. You can see this in the following definition:
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);
All the functions return a value of type memcached_return
, which you can compare against theMEMCACHED_SUCCESS
constant.
15.6.3.3.4 libmemcached
Get Functions
The libmemcached
functions provide both direct access to a single item, and a multiple-key request mechanism that provides much faster responses when fetching a large number of keys simultaneously.
The main get-style function, which is equivalent to the generic get()
is memcached_get()
. This function returns a string pointer, pointing to the value associated with the specified key.
char *memcached_get (memcached_st *ptr, const char *key, size_t key_length, size_t *value_length, uint32_t *flags, memcached_return *error);
A multi-key get, memcached_mget()
, is also available. Using a multiple key get operation is much quicker to do in one block than retrieving the key values with individual calls to memcached_get()
. To start the multi-key get, callmemcached_mget()
:
memcached_return memcached_mget (memcached_st *ptr, char **keys, size_t *key_length, unsigned int number_of_keys);
The return value is the success of the operation. The keys
parameter should be an array of strings containing the keys, and key_length
an array containing the length of each corresponding key. number_of_keys
is the number of keys supplied in the array.
To fetch the individual values, use memcached_fetch()
to get each corresponding value.
char *memcached_fetch (memcached_st *ptr, const char *key, size_t *key_length, size_t *value_length, uint32_t *flags, memcached_return *error);
The function returns the key value, with the key
, key_length
and value_length
parameters being populated with the corresponding key and length information. The function returns NULL
when there are no more values to be returned. A full example, including the populating of the key data and the return of the information is provided here.
#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;}
Running the above application produces the following output:
shell> memc_multi_fetchAdded server successfullyKey huey stored successfullyKey dewey stored successfullyKey louie stored successfullyKey huey returned redKey dewey returned blueKey louie returned green
15.6.3.3.5 Controlling libmemcached
Behaviors
The behavior of libmemcached
can be modified by setting one or more behavior flags. These can either be set globally, or they can be applied during the call to individual functions. Some behaviors also accept an additional setting, such as the hashing mechanism used when selecting servers.
To set global behaviors:
memcached_return memcached_behavior_set (memcached_st *ptr, memcached_behavior flag, uint64_t data);
To get the current behavior setting:
uint64_t memcached_behavior_get (memcached_st *ptr, memcached_behavior flag);
The following table describes libmemcached
behavior flags.
MEMCACHED_BEHAVIOR_NO_BLOCK
Caused libmemcached
to use asynchronous I/O.MEMCACHED_BEHAVIOR_TCP_NODELAY
Turns on no-delay for network sockets.MEMCACHED_BEHAVIOR_HASH
Without a value, sets the default hashing algorithm for keys to use MD5. Other valid values includeMEMCACHED_HASH_DEFAULT
, MEMCACHED_HASH_MD5
,MEMCACHED_HASH_CRC
, MEMCACHED_HASH_FNV1_64
,MEMCACHED_HASH_FNV1A_64
,MEMCACHED_HASH_FNV1_32
, andMEMCACHED_HASH_FNV1A_32
.MEMCACHED_BEHAVIOR_DISTRIBUTION
Changes the method of selecting the server used to store a given value. The default method isMEMCACHED_DISTRIBUTION_MODULA
. You can enable consistent hashing by settingMEMCACHED_DISTRIBUTION_CONSISTENT
.MEMCACHED_DISTRIBUTION_CONSISTENT
is an alias for the valueMEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
.MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
Cache the lookups made to the DNS service. This can improve the performance if you are using names instead of IP addresses for individual hosts.MEMCACHED_BEHAVIOR_SUPPORT_CAS
Support CAS operations. By default, this is disabled because it imposes a performance penalty.MEMCACHED_BEHAVIOR_KETAMA
Sets the default distribution toMEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
and the hash to MEMCACHED_HASH_MD5
.MEMCACHED_BEHAVIOR_POLL_TIMEOUT
Modify the timeout value used by poll()
. Supply a signed int
pointer for the timeout value.MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
Buffers IO requests instead of them being sent. A get operation, or closing the connection causes the data to be flushed.MEMCACHED_BEHAVIOR_VERIFY_KEY
Forces libmemcached
to verify that a specified key is valid.MEMCACHED_BEHAVIOR_SORT_HOSTS
If set, hosts added to the list of configured hosts for amemcached_st
structure are placed into the host list in sorted order. This breaks consistent hashing if that behavior has been enabled.MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
In nonblocking mode this changes the value of the timeout during socket connection.15.6.3.3.6 libmemcached Command-Line Utilities
In addition to the main C library interface, libmemcached
also includes a number of command-line utilities that can be useful when working with and debugging memcached applications.
All of the command-line tools accept a number of arguments, the most critical of which is servers
, which specifies the list of servers to connect to when returning information.
The main tools are:
memcat: Display the value for each ID given on the command line:
shell> memcat --servers=localhost hwkeyHello world
memcp: Copy the contents of a file into the cache, using the file name as the key:
shell> echo "Hello World" > hwkeyshell> memcp --servers=localhost hwkeyshell> memcat --servers=localhost hwkeyHello world
memrm: Remove an item from the cache:
shell> memcat --servers=localhost hwkeyHello worldshell> memrm --servers=localhost hwkeyshell> memcat --servers=localhost hwkey
memslap: Test the load on one or more memcached servers, simulating get/set and multiple client operations. For example, you can simulate the load of 100 clients performing get operations:
shell> memslap --servers=localhost --concurrency=100 --flush --test=getmemslap --servers=localhost --concurrency=100 --flush --test=getThreads connecting to servers 100Took 13.571 seconds to read data
memflush: Flush (empty) the contents of the memcached cache.
shell> memflush --servers=localhost
15.6.3.3 Using libmemcached
with C and C++
- 15.6.3.3.1
libmemcached
Base Functions - 15.6.3.3.2
libmemcached
Server Functions - 15.6.3.3.3
libmemcached
Set Functions - 15.6.3.3.4
libmemcached
Get Functions - 15.6.3.3.5 Controlling
libmemcached
Behaviors - 15.6.3.3.6 libmemcached Command-Line Utilities
The libmemcached
library provides both C and C++ interfaces to memcached and is also the basis for a number of different additional API implementations, including Perl, Python and Ruby. Understanding the corelibmemcached
functions can help when using these other interfaces.
The C library is the most comprehensive interface library for memcached and provides functions and operational systems not always exposed in interfaces not based on the libmemcached
library.
The different functions can be divided up according to their basic operation. In addition to functions that interface to the core API, a number of utility functions provide extended functionality, such as appending and prepending data.
To build and install libmemcached
, download the libmemcached
package, run configure, and then build and install:
shell> tar xjf libmemcached-0.21.tar.gzshell> cd libmemcached-0.21shell> ./configureshell> makeshell> make install
On many Linux operating systems, you can install the corresponding libmemcached
package through the usualyum, apt-get, or similar commands.
To build an application that uses the library, first set the list of servers. Either directly manipulate the servers configured within the main memcached_st
structure, or separately populate a list of servers, and then add this list to the memcached_st
structure. The latter method is used in the following example. Once the server list has been set, you can call the functions to store or retrieve data. A simple application for setting a preset value tolocalhost
is provided here:
#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;}
To test the success of an operation, use the return value, or populated result code, for a given function. The value is always set to MEMCACHED_SUCCESS
if the operation succeeded. In the event of a failure, use thememcached_strerror()
function to translate the result code into a printable string.
To build the application, specify the memcached
library:
shell> gcc -o memc_basic memc_basic.c -lmemcached
Running the above sample application, after starting a memcached server, should return a success message:
shell> memc_basicAdded server successfullyKey stored successfully
15.6.3.3.1 libmemcached
Base Functions
The base libmemcached
functions let you create, destroy and clone the main memcached_st
structure that is used to interface with the memcached
servers. The main functions are defined below:
memcached_st *memcached_create (memcached_st *ptr);
Creates a new memcached_st
structure for use with the other libmemcached
API functions. You can supply an existing, static, memcached_st
structure, or NULL
to have a new structured allocated. Returns a pointer to the created structure, or NULL
on failure.
void memcached_free (memcached_st *ptr);
Frees the structure and memory allocated to a previously created memcached_st
structure.
memcached_st *memcached_clone(memcached_st *clone, memcached_st *source);
Clones an existing memcached
structure from the specified source
, copying the defaults and list of servers defined in the structure.
15.6.3.3.2 libmemcached
Server Functions
The libmemcached
API uses a list of servers, stored within the memcached_server_st
structure, to act as the list of servers used by the rest of the functions. To use memcached
, you first create the server list, and then apply the list of servers to a valid libmemcached
object.
Because the list of servers, and the list of servers within an active libmemcached
object can be manipulated separately, you can update and manage server lists while an active libmemcached
interface is running.
The functions for manipulating the list of servers within a memcached_st
structure are:
memcached_return memcached_server_add (memcached_st *ptr, char *hostname, unsigned int port);
Adds a server, using the given hostname
and port
into the memcached_st
structure given in ptr
.
memcached_return memcached_server_add_unix_socket (memcached_st *ptr, char *socket);
Adds a Unix socket to the list of servers configured in the memcached_st
structure.
unsigned int memcached_server_count (memcached_st *ptr);
Returns a count of the number of configured servers within the memcached_st
structure.
memcached_server_st * memcached_server_list (memcached_st *ptr);
Returns an array of all the defined hosts within a memcached_st
structure.
memcached_return memcached_server_push (memcached_st *ptr, memcached_server_st *list);
Pushes an existing list of servers onto list of servers configured for a current memcached_st
structure. This adds servers to the end of the existing list, and duplicates are not checked.
The memcached_server_st
structure can be used to create a list of memcached
servers which can then be applied individually to memcached_st
structures.
memcached_server_st * memcached_server_list_append (memcached_server_st *ptr, char *hostname, unsigned int port, memcached_return *error);
Adds a server, with hostname
and port
, to the server list in ptr
. The result code is handled by the error
argument, which should point to an existing memcached_return
variable. The function returns a pointer to the returned list.
unsigned int memcached_server_list_count (memcached_server_st *ptr);
Returns the number of the servers in the server list.
void memcached_server_list_free (memcached_server_st *ptr);
Frees the memory associated with a server list.
memcached_server_st *memcached_servers_parse (char *server_strings);
Parses a string containing a list of servers, where individual servers are separated by a comma, space, or both, and where individual servers are of the form
. The return value is a server list structure.server
[:port
]
15.6.3.3.3 libmemcached
Set Functions
The set-related functions within libmemcached
provide the same functionality as the core functions supported by the memcached
protocol. The full definition for the different functions is the same for all the base functions (add
,replace
, prepend
, append
). For example, the function definition for memcached_set()
is:
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);
The ptr
is the memcached_st
structure. The key
and key_length
define the key name and length, and value
and value_length
the corresponding value and length. You can also set the expiration and optional flags. For more information, see Section 15.6.3.3.5, “Controlling libmemcached
Behaviors”.
This table outlines the remainder of the set-related libmemcached
functions and the equivalent core functions supported by the memcached protocol.
libmemcached
Functionmemcached_set(memc, key, key_length, value, value_length, expiration, flags)
Generic set()
operation.memcached_add(memc, key, key_length, value, value_length, expiration, flags)
Generic add()
function.memcached_replace(memc, key, key_length, value, value_length, expiration, flags)
Generic replace()
.memcached_prepend(memc, key, key_length, value, value_length, expiration, flags)
Prepends the specified value
before the current value of the specified key
.memcached_append(memc, key, key_length, value, value_length, expiration, flags)
Appends the specified value
after the current value of the specified key
.memcached_cas(memc, key, key_length, value, value_length, expiration, flags, cas)
Overwrites the data for a given key as long as the corresponding cas
value is still the same within the server.memcached_set_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the generic set()
, but has the option of an additional master key that can be used to identify an individual server.memcached_add_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the generic add()
, but has the option of an additional master key that can be used to identify an individual server.memcached_replace_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the generic replace()
, but has the option of an additional master key that can be used to identify an individual server.memcached_prepend_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the memcached_prepend()
, but has the option of an additional master key that can be used to identify an individual server.memcached_append_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the memcached_append()
, but has the option of an additional master key that can be used to identify an individual server.memcached_cas_by_key(memc, master_key, master_key_length, key, key_length, value, value_length, expiration, flags)
Similar to the memcached_cas()
, but has the option of an additional master key that can be used to identify an individual server.The by_key
methods add two further arguments that define the master key, to be used and applied during the hashing stage for selecting the servers. You can see this in the following definition:
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);
All the functions return a value of type memcached_return
, which you can compare against theMEMCACHED_SUCCESS
constant.
15.6.3.3.4 libmemcached
Get Functions
The libmemcached
functions provide both direct access to a single item, and a multiple-key request mechanism that provides much faster responses when fetching a large number of keys simultaneously.
The main get-style function, which is equivalent to the generic get()
is memcached_get()
. This function returns a string pointer, pointing to the value associated with the specified key.
char *memcached_get (memcached_st *ptr, const char *key, size_t key_length, size_t *value_length, uint32_t *flags, memcached_return *error);
A multi-key get, memcached_mget()
, is also available. Using a multiple key get operation is much quicker to do in one block than retrieving the key values with individual calls to memcached_get()
. To start the multi-key get, callmemcached_mget()
:
memcached_return memcached_mget (memcached_st *ptr, char **keys, size_t *key_length, unsigned int number_of_keys);
The return value is the success of the operation. The keys
parameter should be an array of strings containing the keys, and key_length
an array containing the length of each corresponding key. number_of_keys
is the number of keys supplied in the array.
To fetch the individual values, use memcached_fetch()
to get each corresponding value.
char *memcached_fetch (memcached_st *ptr, const char *key, size_t *key_length, size_t *value_length, uint32_t *flags, memcached_return *error);
The function returns the key value, with the key
, key_length
and value_length
parameters being populated with the corresponding key and length information. The function returns NULL
when there are no more values to be returned. A full example, including the populating of the key data and the return of the information is provided here.
#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;}
Running the above application produces the following output:
shell> memc_multi_fetchAdded server successfullyKey huey stored successfullyKey dewey stored successfullyKey louie stored successfullyKey huey returned redKey dewey returned blueKey louie returned green
15.6.3.3.5 Controlling libmemcached
Behaviors
The behavior of libmemcached
can be modified by setting one or more behavior flags. These can either be set globally, or they can be applied during the call to individual functions. Some behaviors also accept an additional setting, such as the hashing mechanism used when selecting servers.
To set global behaviors:
memcached_return memcached_behavior_set (memcached_st *ptr, memcached_behavior flag, uint64_t data);
To get the current behavior setting:
uint64_t memcached_behavior_get (memcached_st *ptr, memcached_behavior flag);
The following table describes libmemcached
behavior flags.
MEMCACHED_BEHAVIOR_NO_BLOCK
Caused libmemcached
to use asynchronous I/O.MEMCACHED_BEHAVIOR_TCP_NODELAY
Turns on no-delay for network sockets.MEMCACHED_BEHAVIOR_HASH
Without a value, sets the default hashing algorithm for keys to use MD5. Other valid values includeMEMCACHED_HASH_DEFAULT
, MEMCACHED_HASH_MD5
,MEMCACHED_HASH_CRC
, MEMCACHED_HASH_FNV1_64
,MEMCACHED_HASH_FNV1A_64
,MEMCACHED_HASH_FNV1_32
, andMEMCACHED_HASH_FNV1A_32
.MEMCACHED_BEHAVIOR_DISTRIBUTION
Changes the method of selecting the server used to store a given value. The default method isMEMCACHED_DISTRIBUTION_MODULA
. You can enable consistent hashing by settingMEMCACHED_DISTRIBUTION_CONSISTENT
.MEMCACHED_DISTRIBUTION_CONSISTENT
is an alias for the valueMEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
.MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
Cache the lookups made to the DNS service. This can improve the performance if you are using names instead of IP addresses for individual hosts.MEMCACHED_BEHAVIOR_SUPPORT_CAS
Support CAS operations. By default, this is disabled because it imposes a performance penalty.MEMCACHED_BEHAVIOR_KETAMA
Sets the default distribution toMEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
and the hash to MEMCACHED_HASH_MD5
.MEMCACHED_BEHAVIOR_POLL_TIMEOUT
Modify the timeout value used by poll()
. Supply a signed int
pointer for the timeout value.MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
Buffers IO requests instead of them being sent. A get operation, or closing the connection causes the data to be flushed.MEMCACHED_BEHAVIOR_VERIFY_KEY
Forces libmemcached
to verify that a specified key is valid.MEMCACHED_BEHAVIOR_SORT_HOSTS
If set, hosts added to the list of configured hosts for amemcached_st
structure are placed into the host list in sorted order. This breaks consistent hashing if that behavior has been enabled.MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
In nonblocking mode this changes the value of the timeout during socket connection.15.6.3.3.6 libmemcached Command-Line Utilities
In addition to the main C library interface, libmemcached
also includes a number of command-line utilities that can be useful when working with and debugging memcached applications.
All of the command-line tools accept a number of arguments, the most critical of which is servers
, which specifies the list of servers to connect to when returning information.
The main tools are:
memcat: Display the value for each ID given on the command line:
shell> memcat --servers=localhost hwkeyHello world
memcp: Copy the contents of a file into the cache, using the file name as the key:
shell> echo "Hello World" > hwkeyshell> memcp --servers=localhost hwkeyshell> memcat --servers=localhost hwkeyHello world
memrm: Remove an item from the cache:
shell> memcat --servers=localhost hwkeyHello worldshell> memrm --servers=localhost hwkeyshell> memcat --servers=localhost hwkey
memslap: Test the load on one or more memcached servers, simulating get/set and multiple client operations. For example, you can simulate the load of 100 clients performing get operations:
shell> memslap --servers=localhost --concurrency=100 --flush --test=getmemslap --servers=localhost --concurrency=100 --flush --test=getThreads connecting to servers 100Took 13.571 seconds to read data
memflush: Flush (empty) the contents of the memcached cache.
shell> memflush --servers=localhost
- Using libmemcached with C and C++
- Using Swift with Cocoa and Objetive-C
- Using Swift with Cocoa and Objective-C
- c libmemcached连接memcached
- Using C/C++ libraries with Automake and Autoconf
- Using Swift with Cocoa and Objective-C下载
- Using Swift with Cocoa and Objective-C (Swift 2.1)
- Using Swift with Cocoa and Objective-C(第一部分)
- 使用libmemcached的c客户端
- Using OpenAPI with C++[1]
- Using OpenAPI with C++[2]
- Using OpenAPI with C++[3]
- Using C++ With Objective-C
- Using C++ With Objective-C
- Using C++ With Objective-C
- Using C++ With Objective-C
- Using Swift with Cocoa and Objective-C:与 Objective-C 的 API 交互(第二部分)
- Using UTF-8 as the internal representation for strings in C and C++ with Visual Studio
- Latest Oakley Sunglasses Prescription Lowest Price
- Android源码混淆 中 proguard.cfg 或者proguard-android.txt 脚本文件编写知识
- phantomjs实例爬取AJAX页面
- Hot Sale Oakley Sunglasses Military Real
- linux ulimit
- Using libmemcached with C and C++
- hdu 1712 ACboy needs your help (分组背包)
- 关于第三方登录的问题
- sslstrip的安装
- 字符识别OCR研究一(模板匹配&BP神经网络训练)
- linux opencv2.3.1移植到tiny6410 支持视频读写
- coocs2d-x3.1.3编译错误的解决
- 开发商降价促销 上海楼市拐点已现?
- Spring redirect直接返回项目根目录