该库为memcachedlibmemcached
提供 C 和 C++ 接口,也是许多不同的附加 API 实现(包括 Perl 和 Python)的基础。了解核心
功能有助于使用这些其他接口。
libmemcached
C 库是
memcached最全面的接口库,提供了不基于libmemcached
库的接口中不总是公开的功能和操作系统。
不同的功能可以根据它们的基本操作来划分。除了与核心 API 接口的函数外,许多实用函数还提供扩展功能,例如附加和前置数据。
要构建和安装libmemcached
,下载libmemcached
包,运行
配置,然后构建和安装:
$> tar xjf libmemcached-0.21.tar.gz
$> cd libmemcached-0.21
$> ./configure
$> make
$> make install
在许多 Linux 操作系统上,您可以libmemcached
通过常用的yum、apt-get或类似命令安装相应的包。
要构建使用该库的应用程序,首先要设置服务器列表。要么直接操作主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
库:
$> gcc -o memc_basic memc_basic.c -lmemcached
运行上面的示例应用程序,在启动 memcached服务器后,应该会返回一条成功消息:
$> memc_basic
Added server successfully
Key stored successfully
基本libmemcached
函数允许您创建、销毁和克隆
memcached_st
用于与memcached
服务器交互的主要结构。主要函数定义如下:
memcached_st *memcached_create (memcached_st *ptr);
创建memcached_st
用于其他libmemcached
API 函数的新结构。您可以提供现有的静态
memcached_st
结构,或
NULL
分配新的结构。返回指向创建的结构的指针,或
NULL
失败。
void memcached_free (memcached_st *ptr);
释放分配给先前创建的memcached_st
结构的结构和内存。
memcached_st *memcached_clone(memcached_st *clone, memcached_st *source);
memcached
从指定的
克隆现有结构source
,复制结构中定义的默认值和服务器列表。
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
到中
memcached_st
给定的结构
ptr
。
memcached_return
memcached_server_add_unix_socket (memcached_st *ptr,
char *socket);
将 Unix 套接字添加到
memcached_st
结构中配置的服务器列表中。
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
]
其中的集合相关函数
提供与协议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
和
和对应的值和长度。您还可以设置过期和可选标志。有关详细信息,请参阅
第 16.2.3.3.5 节,“控制行为”。
key_length
value
value_length
libmemcached
下表概述了与集合相关的其余
函数以及memcached
协议
libmemcached
支持的等效核心函数。
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) |
类似于 generic set() ,但有一个额外的主密钥选项,可用于识别单个服务器。 |
memcached_add_by_key(memc, master_key, master_key_length, key,
key_length, value, value_length, expiration,
flags) |
类似于 generic add() ,但有一个额外的主密钥选项,可用于识别单个服务器。 |
memcached_replace_by_key(memc, master_key, master_key_length,
key, key_length, value, value_length, expiration,
flags) |
类似于 generic 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);
所有函数都返回 type 的值
memcached_return
,您可以将其与MEMCACHED_SUCCESS
常量进行比较。
这些libmemcached
函数既提供对单个项目的直接访问,也提供多键请求机制,在同时获取大量键时提供更快的响应。
主要的 get-style 函数,相当于泛型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);
还可以使用多键获取memcached_mget()
。在一个块中使用多键获取操作比通过单独调用检索键值要快得多memcached_get()
。要启动多键获取,请调用
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;
}
运行上述应用程序会产生以下输出:
$> 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
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 |
打开网络套接字的无延迟。 |
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 |
缓冲 IO 请求而不是发送它们。get 操作或关闭连接会导致数据被刷新。 |
MEMCACHED_BEHAVIOR_VERIFY_KEY |
强制libmemcached 验证指定的密钥是否有效。 |
MEMCACHED_BEHAVIOR_SORT_HOSTS |
如果设置,添加到
memcached_st 结构的已配置主机列表的主机将按排序顺序放入主机列表。如果启用了该行为,这会破坏一致性哈希。 |
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT |
在非阻塞模式下,这会更改套接字连接期间的超时值。 |
除了主要的 C 库界面外,
libmemcached
还包括许多命令行实用程序,这些实用程序在使用和调试memcached应用程序时很有用。
所有命令行工具都接受许多参数,其中最关键的是servers
,它指定返回信息时要连接的服务器列表。
主要工具有:
memcat:显示命令行上给定的每个 ID 的值:
$> memcat --servers=localhost hwkey Hello world
memcp:将文件内容复制到缓存中,使用文件名作为键:
$> echo "Hello World" > hwkey $> memcp --servers=localhost hwkey $> memcat --servers=localhost hwkey Hello world
memrm:从缓存中删除一个项目:
$> memcat --servers=localhost hwkey Hello world $> memrm --servers=localhost hwkey $> memcat --servers=localhost hwkey
memslap:测试一个或多个 memcached服务器上的负载,模拟 get/set 和多个客户端操作。例如,您可以模拟 100 个客户端执行 get 操作的负载:
$> 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缓存的内容。
$> memflush --servers=localhost