[+/-]
        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 core
        libmemcached functions can help when using
        these other interfaces.
      
        The C library is the most comprehensive interface library for
        memcached and provides a wealth of functions
        and operational systems not always exposed in the other
        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, there are a number of utility functions that 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.gz shell> cd libmemcached-0.21 shell> ./configure shell> make shell> make install
        On many Linux operating systems, you can install the
        corresponding libmemcached package through
        the usual yum, apt-get or
        similar commands. On OpenSolaris, use pkg to
        install the SUNWlibmemcached package.
      
        To build an application that uses the library, you need to first
        set the list of servers. You can do this either by directly
        manipulating the servers configured within the main
        memcached_st structure, or by separately
        populating a list of servers, and then adding 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 to localhost 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;
}
        You can test the success of an operation by using the return
        value, or populated result code, for a given function. The value
        will always be set to MEMCACHED_SUCCESS if
        the operation succeeded. In the event of a failure, use the
        memcached_strerror() function to translate
        the result code into a printable string.
      
        To build the application, you must 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_basic Added server successfully Key stored successfully
          The base libmemcached functions allow you
          to create, destroy and clone the main
          memcached_st structure that is used to
          interface to 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);
          Free the structure and memory allocated to a previously
          created memcached_st structure.
        
memcached_st *memcached_clone(memcached_st *clone, memcached_st *source);
          Clone an existing memcached structure from
          the specified source, copying the defaults
          and list of servers defined in the structure.
        
          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 given below:
        
memcached_return
           memcached_server_add (memcached_st *ptr,
                                 char *hostname,
                                 unsigned int port);
          Add 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);
          Add a Unix socket to the list of servers configured in the
          memcached_st structure.
        
unsigned int memcached_server_count (memcached_st *ptr);
          Return 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);
          Add 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);
Return the number of the servers in the server list.
void memcached_server_list_free (memcached_server_st *ptr);
Free up 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 and/or space, and where
          individual servers are of the form
          server[:port]. The return value is a server
          list structure.
        
          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 14.5.3.1.5, “libmemcached Behaviors”.
        
The following table outlines the remainder of the set-related functions.
| libmemcachedFunction | Equivalent to | 
|---|---|
| memcached_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 valuebefore the current value
                  of the specifiedkey. | 
| memcached_append(memc, key, key_length, value, value_length,
                  expiration, flags) | Appends the specified valueafter the current value
                  of the specifiedkey. | 
| memcached_cas(memc, key, key_length, value, value_length,
                  expiration, flags, cas) | Overwrites the data for a given key as long as the corresponding casvalue 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, 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 the MEMCACHED_SUCCESS constant.
        
          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(). The functions a string
          pointer to the returned value for a corresponding 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, you need to call
          memcached_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, you need to 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:
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
          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);
| Behavior | Description | 
|---|---|
| MEMCACHED_BEHAVIOR_NO_BLOCK | Caused libmemcachedto 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 include MEMCACHED_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 is MEMCACHED_DISTRIBUTION_MODULA. You
                  can enable consistent hashing by settingMEMCACHED_DISTRIBUTION_CONSISTENT.MEMCACHED_DISTRIBUTION_CONSISTENTis 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 to MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMAand the hash toMEMCACHED_HASH_MD5. | 
| MEMCACHED_BEHAVIOR_POLL_TIMEOUT | Modify the timeout value used by poll(). You should
                  supply asigned intpointer for the
                  timeout value. | 
| MEMCACHED_BEHAVIOR_BUFFER_REQUESTS | Buffers IO requests instead of them being sent. A get operation, or closing the connection will cause the data to be flushed. | 
| MEMCACHED_BEHAVIOR_VERIFY_KEY | Forces libmemcachedto verify that a specified key is
                  valid. | 
| MEMCACHED_BEHAVIOR_SORT_HOSTS | If set, hosts added to the list of configured hosts for a memcached_ststructure will placed
                  into the host list in sorted order. This will break
                  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. | 
          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 hwkey Hello world
memcp — copy the contents of a file into the cache, using the file names as the key:
shell> echo "Hello World" > hwkey shell> memcp --servers=localhost hwkey shell> memcat --servers=localhost hwkey Hello world
memrm — remove an item from the cache:
shell> memcat --servers=localhost hwkey Hello world shell> memrm --servers=localhost hwkey shell> 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=get memslap --servers=localhost --concurrency=100 --flush --test=get Threads connecting to servers 100 Took 13.571 seconds to read data
memflush — flush (empty) the contents of the memcached cache.
shell> memflush --servers=localhost


User Comments
Add your own comment.