<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]libmemcached使用（c 客户端连接 memcached），封装 libmemcached 构建 memcached 客户端。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Cache与Store]]></category>
<pubDate>Sun, 15 Feb 2015 09:05:39 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：如果要用c写成一个服务部署4台机器，均得和memcached交互，还得用这个库，如PHP的扩展啥的没怎么和c的lib打交到，这下实践一下挺好的，过程比较曲折但是也发现了这memcached用新的gcc还是对配置上有一些影响的，就单说配置这块的门槛就变高了，更别说c下的调试啥的，实践起来仅仅通过网上的一篇文章未必能搞定。<br/>libmemcached是C客户端到memcached服 务器的接口库。具有低内存占用率、线程安全、并提供对memcached功能的全面支持。它还采用多种命令行工具，包括： memcat、memflush、memrm、memstat、memslap。<br/>在Ubuntu上安装memcached和libmemcached&nbsp;&nbsp;http://www.linuxidc.com/Linux/2010-04/25543.htm<br/>libmemcached C/C++ API使用实例 http://www.linuxidc.com/Linux/2012-01/52516.htm<br/>memcached简单的使用教程(转载):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://blog.csdn.net/huangqiwa/article/details/21174425<br/>使用连接池访问memcached(libmemcached)的完整例子:http://blog.csdn.net/hzhxxx/article/details/41961355<br/><br/>（1）封装 libmemcached 构建 memcached 客户端：http://blog.csdn.net/yanghw0510/article/details/7292236<br/>（2）libmemcached使用（c 客户端连接 memcached） :<br/>（3）libmemcached 下载地址。https://launchpad.net/libmemcached/<br/><br/>1、下载安装libmemcached <br/> $ wget http://launchpad.net/libmemcached/1.0/0.44/+download/libmemcached-0.44.tar.gz<br/> $ tar xvzf libmemcached-0.44tar.gz <br/> $ cd libmemcached-0.44<br/> $ ./configure<br/> $ make<br/> $ sudo make install<br/> libmemcached 默认安装在/usr/local/,头文件安装在/usr/local/include/libmemcachde/,动态库默认安装在/usr/local/lib/下。<br/>我在这儿下的：https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz<br/>注:<br/>如果报”./libmemcached-1.0/memcached.h:46:27: error: tr1/cinttypes: No such file or directory”错误,则需要升级gcc版本.<br/>处理如下：<br/>yum install gcc44 gcc44-c++ libstdc++44-devel<br/>export CC=/usr/bin/gcc44<br/>export CXX=/usr/bin/g++44<br/>重新编译安装libmemcached-1.0.9<br/>关键信息：error: tr1/cinttypes: No such file or directory<br/>报错原因：libmemcached需要 gcc 4.2 以上版本才可编译，而centos 5.4 的gcc版本只有4.1 ，详见：https://bugs.launchpad.net/libmemcached/+bug/1076181<br/>解决方法：安装gcc44的扩展包，详见：http://gearman.info/build/centos5-8.html<br/>export就是在于此，把这个gcc和g++的版本号给提上去，以方便这个memcached的编译：<br/>/usr/bin/gcc44 -v<br/>gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)<br/><br/>gcc -v<br/>gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)<br/><br/>/usr/bin/g++44 -v<br/>gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC) <br/> g++ -v<br/>gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)<br/>——————————————————————————————————————————————————————————<br/>这个问题在安gearman时也遇到过，升级gcc，参考连接： http://jackxiang.com/post/7693/ ，软链接如下所示：<br/> export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc<br/> export CXX=/usr/bin/g++44<br/> ./configure &amp;&amp; make &amp;&amp; make install&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/><br/>./configure &amp;&amp; make &amp;&amp; make install<br/> /usr/bin/install -c -m 644 support/libmemcached.pc &#039;/usr/local/lib/pkgconfig&#039;<br/>make[2]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18&#039;<br/>make[1]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18&#039;<br/><br/>g++ -o testmemcached testmemcached.cpp -lmemcached&nbsp;&nbsp;<br/>In file included from /usr/local/include/libmemcached/memcached.h:39,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from testmemcached.cpp:6:<br/>/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory<br/>明天再整下，估计是so没有给ldd进来...<br/>2、libmemcached简单测试使用<br/><textarea name="code" class="php" rows="15" cols="100">
//g++ -o testmemcached testmemcached.cpp -lmemcached
///usr/bin/g++44 -g&nbsp;&nbsp;-o testmemcached testmemcached.cpp -lmemcached -lrt&nbsp;&nbsp;-std=c++0x

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;libmemcached/memcached.h&gt;

using namespace std;

int main(int argc,char *argv[])
&#123;
&nbsp;&nbsp; //connect server

&nbsp;&nbsp; memcached_st *memc;
&nbsp;&nbsp; memcached_return rc;
&nbsp;&nbsp; memcached_server_st *server;
&nbsp;&nbsp; time_t expiration;
&nbsp;&nbsp; uint32_t flags;

&nbsp;&nbsp; memc = memcached_create(NULL);
&nbsp;&nbsp; server = memcached_server_list_append(NULL,&quot;localhost&quot;,11211,&amp;rc);
&nbsp;&nbsp; rc=memcached_server_push(memc,server);
&nbsp;&nbsp; memcached_server_list_free(server);

&nbsp;&nbsp; string key = &quot;key&quot;;
&nbsp;&nbsp; string value = &quot;value&quot;;
&nbsp;&nbsp; size_t value_length = value.length();
&nbsp;&nbsp; size_t key_length = key.length();


&nbsp;&nbsp; //Save data

&nbsp;&nbsp; rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
&nbsp;&nbsp; if(rc==MEMCACHED_SUCCESS)
&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;&quot;Save data:&quot;&lt;&lt;value&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;
&nbsp;&nbsp; &#125;

&nbsp;&nbsp; //Get data

&nbsp;&nbsp; char* result = memcached_get(memc,key.c_str(),key_length,&amp;value_length,&amp;flags,&amp;rc);
&nbsp;&nbsp; if(rc == MEMCACHED_SUCCESS)
&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;&quot;Get value:&quot;&lt;&lt;result&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;
&nbsp;&nbsp; &#125;

&nbsp;&nbsp; //Delete data

&nbsp;&nbsp; rc=memcached_delete(memc,key.c_str(),key_length,expiration);
&nbsp;&nbsp; if(rc==MEMCACHED_SUCCESS)
&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;&quot;Delete key:&quot;&lt;&lt;key&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;
&nbsp;&nbsp; &#125;

&nbsp;&nbsp; //free

&nbsp;&nbsp; memcached_free(memc);
&nbsp;&nbsp; return 0;
&#125;
</textarea><br/><br/>编译：g++ -o testmemcached testmemcached.cpp -lmemcached<br/>运行：./testmemcached<br/>结果：Save data:value sucessful!<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get value:value sucessful!<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delete key:key sucessful!<br/><br/>实践编译一下：<br/> g++ -o testmemcached testmemcached.cpp -lmemcached<br/>In file included from /usr/local/include/libmemcached/memcached.h:39,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from testmemcached.cpp:6:<br/>/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory<br/>看来还得重新export一次新的编译器，因为昨天的关了终端，今天的又没了：<br/> export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc&nbsp;&nbsp;//这行有问题~<br/> export CXX=/usr/bin/g++44<br/> g++ -o testmemcached testmemcached.cpp -lmemcached<br/>为何还是不行？<br/> echo $CC<br/>/usr/bin/gcc&nbsp;&nbsp;//没变，这儿有问题，再重新设置一次，查到上面这个or有问题：export CC=/usr/bin/gcc44。<br/># echo $CXX<br/>/usr/bin/g++44 //变了<br/><br/>重新设置，好了：<br/>export CC=/usr/bin/gcc44<br/>/usr/bin/gcc44<br/><br/>继续折腾，/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached <br/>In file included from /usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/cinttypes:35,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from /usr/local/include/libmemcached-1.0/memcached.h:46,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from /usr/local/include/libmemcached/memcached.h:39,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from testmemcached.cpp:6:<br/>/usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.<br/> <br/><br/>#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. <br/>加上：-lpthread -std=c++0x ，解决如下：<br/> g++ -o testmemcached testmemcached.cpp -lmemcached -lpthread -std=c++0x <br/>/usr/bin/ld: cannot find -lmemcached<br/>collect2: ld returned 1 exit status&nbsp;&nbsp;<br/>也就是说编译器并不能从ldconfig 里得知，其lib在哪儿（及时把Lib路径加入到/etc/ld.so.conf.d/libmemcache.conf），得指定：<br/><textarea name="code" class="php" rows="15" cols="100">
 g++ -o testmemcached testmemcached.cpp -lmemcached -lpthread -std=c++0x&nbsp;&nbsp;-L/usr/local/libmemcached/lib/ 
 ldconfig -p&#124;grep memcache
 libmemcached.so (libc6,x86-64) =&gt; /usr/local/libmemcached/lib/libmemcached.so&nbsp;&nbsp; AddTime:2017-08-01
</textarea><br/><br/> 在网上找了一下，发现是这样的：http://blog.163.com/guixl_001/blog/static/4176410420121021111117987/ 里说得加一个新的参数，是和宏相关，那就加了，<br/> 指定一个新的参数：-std=c++0x :<br/> /usr/bin/gcc44&nbsp;&nbsp;-o testmemcached testmemcached.cpp -lmemcached&nbsp;&nbsp; -std=c++0x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>/usr/local/lib/libmemcached.so: undefined reference to `pthread_once&#039;<br/>collect2: ld returned 1 exit status<br/><br/><br/>/usr/bin/g++44&nbsp;&nbsp;-o testmemcached testmemcached.cpp -lmemcached&nbsp;&nbsp; -std=c++0x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>/usr/local/lib/libmemcached.so: undefined reference to `pthread_once&#039;<br/>怎样彻底解决&quot;undefined reference to `pthread_create&#039;&quot;问题 ，说是加个： -lrt ，这一看就是那个memcached的库包含了这个文件：#include&lt;pthread.h&gt;<br/>来源参考：<br/>http://bbs.chinaunix.net/thread-1586752-1-1.html<br/><br/>于是Ok啦，最终O了，如下：<br/>[root@test testmemcachedcpp]# /usr/bin/g++44&nbsp;&nbsp;-o testmemcached testmemcached.cpp -lmemcached -lrt&nbsp;&nbsp;-std=c++0x <br/>[root@test testmemcachedcpp]#&nbsp;&nbsp;<br/>运行一下试试：<br/>[root@test testmemcachedcpp]#&nbsp;&nbsp;./testmemcached<br/>./testmemcached: error while loading shared libraries: libmemcached.so.11: cannot open shared object file: No such file or directory<br/>[root@test /]# find . -name &quot;libmemcached.so.11&quot;<br/>./usr/local/lib/libmemcached.so.11<br/>打开配置文件 vi /etc/ld.so.conf<br/>加上一行：/usr/local/lib <br/>执行/sbin/ldconfig /etc/ld.so.conf<br/>[root@test testmemcachedcpp]# /sbin/ldconfig /etc/ld.so.conf<br/>[root@test testmemcachedcpp]# ./testmemcached&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>[root@test testmemcachedcpp]# <br/>没报错了~，用gdb看一下 加个-g参数：<br/>/usr/bin/g++44 -g&nbsp;&nbsp;-o testmemcached testmemcached.cpp -lmemcached -lrt&nbsp;&nbsp;-std=c++0x <br/><br/>发现localhost没有开11211，于是找了一台机器把ip和端口写上，重新编译一次后运行Ok，如下：<br/>[root@test testmemcachedcpp]# ./testmemcached <br/>Save data:value sucessful!<br/>Get value:value sucessful!<br/><br/>少了一个删除成功的，简单调试一下：<br/>(gdb) n<br/>Get value:value sucessful!<br/>50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rc=memcached_delete(memc,key.c_str(),key_length,expiration);<br/>(gdb) p key.c_str()<br/>$5 = 0x184372e8 &quot;key&quot;<br/>(gdb) p key_length<br/>$6 = 3<br/>(gdb) n<br/>51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rc==MEMCACHED_SUCCESS)<br/>(gdb) p rc<br/>$3 = MEMCACHED_INVALID_ARGUMENTS<br/><br/>也就是调这个函数的参数不对，返回不是MEMCACHED_SUCCESS，所以没有打印出：cout&lt;&lt;&quot;Delete key:&quot;&lt;&lt;key&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;<br/><br/>####################新的代码里grep了一下该方法###########################<br/>./tests/mem_udp.cc:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcached_delete(memc, test_literal_param(&quot;foo&quot;), 0));<br/>./libmemcached-1.0/memcached.hpp:&nbsp;&nbsp;&nbsp;&nbsp;return memcached_success(memcached_delete(memc_, key.c_str(), key.length(), 0));<br/>./libmemcached-1.0/memcached.hpp:&nbsp;&nbsp;&nbsp;&nbsp;return memcached_success(memcached_delete(memc_,<br/>./tests/libmemcached-1.0/replication.cc:&nbsp;&nbsp;&nbsp;&nbsp;memcached_return_t del_rc= memcached_delete(memc_replicated,<br/>./tests/libmemcached-1.0/mem_functions.cc:&nbsp;&nbsp;&nbsp;&nbsp;rc= memcached_delete(memc, &quot;foo&quot;, 3, 1);<br/><br/>./tests/libmemcached-1.0/mem_functions.cc:&nbsp;&nbsp;&nbsp;&nbsp;test_compare(MEMCACHED_BUFFERED, (rc= memcached_delete(memc, &quot;foo&quot;, 3, 0)));<br/>./tests/libmemcached-1.0/mem_functions.cc:&nbsp;&nbsp;&nbsp;&nbsp;test_compare(MEMCACHED_SUCCESS, memcached_delete(memc, &quot;foo&quot;, 3, 0));<br/>./tests/libmemcached-1.0/mem_functions.cc:&nbsp;&nbsp;&nbsp;&nbsp;test_compare(MEMCACHED_NOTFOUND, memcached_delete(memc, &quot;foo&quot;, 3, 0));<br/><br/>####################################################################<br/>于是修改为下面这样：<br/>//rc=memcached_delete(memc,key.c_str(),key_length,expiration);<br/>rc=memcached_delete(memc,key.c_str(),key_length,0);<br/><br/>./testmemcached <br/>Save data:value2 sucessful!<br/>Get value:value2 sucessful!<br/>Delete key:key sucessful!<br/><br/>刚才失败时有值，现在运行后没值了，给成功删除了：<br/>[root@localhost ~]# telnet 192.168.108.7 11211<br/>Escape character is &#039;^]&#039;.<br/>get key<br/>VALUE key 0 5<br/>value<br/>END<br/>get key<br/>END<br/><br/><br/><br/>后面怎么结合c的socket 及epoll进行进程/线程调试就不再细说了，我也在摸索中，应该也有相关的调试办法，但这儿说明这个memcached搞个新的gcc版本库才能编译确实带了相当多编译及配置上的的麻烦~<br/><br/>最后，用C函数里的add函数实现类php的memcache的扩展的原子操作函数，如下：<br/>原子操作方法，假如有add后就不能再add，必须删除后才能add，这个可以用作锁：<br/>./libmemcached-1.0.18/libmemcached-1.0/memcached.hpp:&nbsp;&nbsp;&nbsp;&nbsp;<br/><textarea name="code" class="C" rows="15" cols="100">
return memcached_success(memcached_add(memc_, key.c_str(), key.length(),
&nbsp;&nbsp;/**
&nbsp;&nbsp; * Add an object with the specified key and value to the server. This
&nbsp;&nbsp; * function returns false if the object already exists on the server.
&nbsp;&nbsp; *
&nbsp;&nbsp; * @param[in] key key of object to add
&nbsp;&nbsp; * @param[in] value of object to add
&nbsp;&nbsp; * @return true on success; false otherwise
&nbsp;&nbsp; */
&nbsp;&nbsp;bool add(const std::string&amp; key, const std::vector&lt;char&gt;&amp; value)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;return memcached_success(memcached_add(memc_, key.c_str(), key.length(),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;value[0], value.size(), 0, 0));
&nbsp;&nbsp;&#125;
</textarea><br/><br/>和php的add函数一样第一次运行时没有问题此时值设置成功，再运行add时一次就add不进去，add设置进去后，用set是能重新设置进去的，只是用add原子操作是不行的，用它来做锁很好使：<br/>1）代码片段：<br/><textarea name="code" class="C" rows="15" cols="100">
 //add data,then test set data error 

 rc=memcached_add(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
 if(rc==MEMCACHED_SUCCESS)
 &#123;
&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;&quot;Add data:&quot;&lt;&lt;value&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;
 &#125;else&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;Add data:&quot;&lt;&lt;value&lt;&lt;&quot; unsucessful,Perhaps add key before set !&quot;&lt;&lt;endl;
 &#125;

</textarea><br/>2）运行情况：<br/>[root@test testmemcachedcpp]# gdb testmemcached<br/>b 41<br/>r<br/>Add data:value unsucessful,Perhaps add key before set !<br/>(gdb) p rc<br/>$2 = MEMCACHED_NOTSTORED<br/>但是能够set进去：<br/>42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);<br/>(gdb) n<br/>43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rc==MEMCACHED_SUCCESS)<br/>(gdb) p rc<br/>$3 = MEMCACHED_SUCCESS<br/>EOF<br/><br/><br/>对add后的键对应的值，再用set方法是可以设置的，如下：<br/>string key = &quot;key2&quot;;<br/>string value = &quot;jackxiang&quot;;<br/>rc=memcached_add(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);<br/>后再修改这个值：<br/>value = &quot;xiangdong&quot;; <br/>rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);<br/><br/>用gdb的断点跟踪一下并用telnet在设置后查看，如下：<br/>[root@localhost ~]# telnet 192.168.108.7 11211<br/>Escape character is &#039;^]&#039;.<br/>get key2<br/>END<br/>get key2<br/>VALUE key2 0 9<br/>jackxiang<br/>END<br/>get key2<br/>VALUE key2 0 9<br/>xiangdong<br/>END<br/><br/>听说，在下载客户端libmemcached-1.0.18/tests 下有测试列子，也可参考。比如cpp_example.cc<br/>ls ~+/cpp_example.cc<br/>/tmp/testmemcachedcpp/libmemcached-1.0.18/tests/cpp_example.cc<br/><br/>摘自：http://www.cppblog.com/kefeng/archive/2010/10/11/129422.html<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://blog.chinaunix.net/uid-52437-id-2108905.html<br/>后发现这个哥们写的文章很详细，http://blog.chinaunix.net/uid-20548989-id-1667248.html<br/><br/>加入add后，rc=MEMCACHED_NOTSTORED情况，代码贴下面：<br/><textarea name="code" class="C" rows="15" cols="100">
//g++ -o testmemcached testmemcached.cpp -lmemcached
///usr/bin/g++44 -g&nbsp;&nbsp;-o testmemcached testmemcached.cpp -lmemcached -lrt&nbsp;&nbsp;-std=c++0x


#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;libmemcached/memcached.h&gt;

using namespace std;

int main(int argc,char *argv[])
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;//connect server

&nbsp;&nbsp;&nbsp;&nbsp;memcached_st *memc;
&nbsp;&nbsp;&nbsp;&nbsp;memcached_return rc;
&nbsp;&nbsp;&nbsp;&nbsp;memcached_server_st *server;
&nbsp;&nbsp;&nbsp;&nbsp;time_t expiration;
&nbsp;&nbsp;&nbsp;&nbsp;uint32_t flags;

&nbsp;&nbsp;&nbsp;&nbsp;memc = memcached_create(NULL);
&nbsp;&nbsp;&nbsp;&nbsp;//server = memcached_server_list_append(NULL,&quot;192.168.109.7&quot;,11211,&amp;rc);
&nbsp;&nbsp;&nbsp;&nbsp;server = memcached_server_list_append(NULL,&quot;192.168.109.7&quot;,21211,&amp;rc);//TTServer
&nbsp;&nbsp;&nbsp;&nbsp;rc=memcached_server_push(memc,server);
&nbsp;&nbsp;&nbsp;&nbsp;memcached_server_list_free(server);

&nbsp;&nbsp;&nbsp;&nbsp;string key = &quot;key&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;string value = &quot;value&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;size_t value_length = value.length();
&nbsp;&nbsp;&nbsp;&nbsp;size_t key_length = key.length();

&nbsp;&nbsp;&nbsp;&nbsp;//add data,then test set data error 
&nbsp;&nbsp;&nbsp;&nbsp;rc=memcached_add(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
&nbsp;&nbsp;&nbsp;&nbsp;if(rc==MEMCACHED_SUCCESS)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;Add data:&quot;&lt;&lt;value&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;else&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;Add data:&quot;&lt;&lt;value&lt;&lt;&quot; unsucessful,Perhaps add key before set !&quot;&lt;&lt;endl;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;//Save data

&nbsp;&nbsp;&nbsp;&nbsp;rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
&nbsp;&nbsp;&nbsp;&nbsp;if(rc==MEMCACHED_SUCCESS)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;Save data:&quot;&lt;&lt;value&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;//Get data

&nbsp;&nbsp;&nbsp;&nbsp;char* result = memcached_get(memc,key.c_str(),key_length,&amp;value_length,&amp;flags,&amp;rc);
&nbsp;&nbsp;&nbsp;&nbsp;if(rc == MEMCACHED_SUCCESS)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;Get value:&quot;&lt;&lt;result&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;//Delete data

&nbsp;&nbsp;&nbsp;&nbsp;//rc=memcached_delete(memc,key.c_str(),key_length,expiration);
&nbsp;&nbsp;&nbsp;&nbsp;rc=memcached_delete(memc,key.c_str(),key_length,0); 
&nbsp;&nbsp;&nbsp;&nbsp;if(rc==MEMCACHED_SUCCESS)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;Delete key:&quot;&lt;&lt;key&lt;&lt;&quot; sucessful!&quot;&lt;&lt;endl;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;//free

&nbsp;&nbsp;&nbsp;&nbsp;memcached_free(memc);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&#125;


</textarea>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]libmemcached使用（c 客户端连接 memcached），封装 libmemcached 构建 memcached 客户端。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>