标题:[实践OK]libmemcached使用(c 客户端连接 memcached),封装 libmemcached 构建 memcached 客户端。 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Sun, 15 Feb 2015 17:05:39 +0000 作者:jackxiang 地址:http://jackxiang.com/post/7814/ 内容: 背景:如果要用c写成一个服务部署4台机器,均得和memcached交互,还得用这个库,如PHP的扩展啥的没怎么和c的lib打交到,这下实践一下挺好的,过程比较曲折但是也发现了这memcached用新的gcc还是对配置上有一些影响的,就单说配置这块的门槛就变高了,更别说c下的调试啥的,实践起来仅仅通过网上的一篇文章未必能搞定。 libmemcached是C客户端到memcached服 务器的接口库。具有低内存占用率、线程安全、并提供对memcached功能的全面支持。它还采用多种命令行工具,包括: memcat、memflush、memrm、memstat、memslap。 在Ubuntu上安装memcached和libmemcached http://www.linuxidc.com/Linux/2010-04/25543.htm libmemcached C/C++ API使用实例 http://www.linuxidc.com/Linux/2012-01/52516.htm memcached简单的使用教程(转载): http://blog.csdn.net/huangqiwa/article/details/21174425 使用连接池访问memcached(libmemcached)的完整例子:http://blog.csdn.net/hzhxxx/article/details/41961355 (1)封装 libmemcached 构建 memcached 客户端:http://blog.csdn.net/yanghw0510/article/details/7292236 (2)libmemcached使用(c 客户端连接 memcached) : (3)libmemcached 下载地址。https://launchpad.net/libmemcached/ 1、下载安装libmemcached $ wget http://launchpad.net/libmemcached/1.0/0.44/+download/libmemcached-0.44.tar.gz $ tar xvzf libmemcached-0.44tar.gz $ cd libmemcached-0.44 $ ./configure $ make $ sudo make install libmemcached 默认安装在/usr/local/,头文件安装在/usr/local/include/libmemcachde/,动态库默认安装在/usr/local/lib/下。 我在这儿下的:https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz 注: 如果报”./libmemcached-1.0/memcached.h:46:27: error: tr1/cinttypes: No such file or directory”错误,则需要升级gcc版本. 处理如下: yum install gcc44 gcc44-c++ libstdc++44-devel export CC=/usr/bin/gcc44 export CXX=/usr/bin/g++44 重新编译安装libmemcached-1.0.9 关键信息:error: tr1/cinttypes: No such file or directory 报错原因:libmemcached需要 gcc 4.2 以上版本才可编译,而centos 5.4 的gcc版本只有4.1 ,详见:https://bugs.launchpad.net/libmemcached/+bug/1076181 解决方法:安装gcc44的扩展包,详见:http://gearman.info/build/centos5-8.html export就是在于此,把这个gcc和g++的版本号给提上去,以方便这个memcached的编译: /usr/bin/gcc44 -v gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC) gcc -v gcc version 4.1.2 20080704 (Red Hat 4.1.2-46) /usr/bin/g++44 -v gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC) g++ -v gcc version 4.1.2 20080704 (Red Hat 4.1.2-46) —————————————————————————————————————————————————————————— 这个问题在安gearman时也遇到过,升级gcc,参考连接: http://jackxiang.com/post/7693/ ,软链接如下所示: export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc export CXX=/usr/bin/g++44 ./configure && make && make install ./configure && make && make install /usr/bin/install -c -m 644 support/libmemcached.pc '/usr/local/lib/pkgconfig' make[2]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18' make[1]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18' g++ -o testmemcached testmemcached.cpp -lmemcached In file included from /usr/local/include/libmemcached/memcached.h:39, from testmemcached.cpp:6: /usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory 明天再整下,估计是so没有给ldd进来... 2、libmemcached简单测试使用 //g++ -o testmemcached testmemcached.cpp -lmemcached ///usr/bin/g++44 -g -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x #include #include #include using namespace std; int main(int argc,char *argv[]) { //connect server memcached_st *memc; memcached_return rc; memcached_server_st *server; time_t expiration; uint32_t flags; memc = memcached_create(NULL); server = memcached_server_list_append(NULL,"localhost",11211,&rc); rc=memcached_server_push(memc,server); memcached_server_list_free(server); string key = "key"; string value = "value"; size_t value_length = value.length(); size_t key_length = key.length(); //Save data rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags); if(rc==MEMCACHED_SUCCESS) { cout<<"Save data:"< /usr/local/libmemcached/lib/libmemcached.so AddTime:2017-08-01 在网上找了一下,发现是这样的:http://blog.163.com/guixl_001/blog/static/4176410420121021111117987/ 里说得加一个新的参数,是和宏相关,那就加了, 指定一个新的参数:-std=c++0x : /usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x /usr/local/lib/libmemcached.so: undefined reference to `pthread_once' collect2: ld returned 1 exit status /usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x /usr/local/lib/libmemcached.so: undefined reference to `pthread_once' 怎样彻底解决"undefined reference to `pthread_create'"问题 ,说是加个: -lrt ,这一看就是那个memcached的库包含了这个文件:#include 来源参考: http://bbs.chinaunix.net/thread-1586752-1-1.html 于是Ok啦,最终O了,如下: [root@test testmemcachedcpp]# /usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x [root@test testmemcachedcpp]# 运行一下试试: [root@test testmemcachedcpp]# ./testmemcached ./testmemcached: error while loading shared libraries: libmemcached.so.11: cannot open shared object file: No such file or directory [root@test /]# find . -name "libmemcached.so.11" ./usr/local/lib/libmemcached.so.11 打开配置文件 vi /etc/ld.so.conf 加上一行:/usr/local/lib 执行/sbin/ldconfig /etc/ld.so.conf [root@test testmemcachedcpp]# /sbin/ldconfig /etc/ld.so.conf [root@test testmemcachedcpp]# ./testmemcached [root@test testmemcachedcpp]# 没报错了~,用gdb看一下 加个-g参数: /usr/bin/g++44 -g -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x 发现localhost没有开11211,于是找了一台机器把ip和端口写上,重新编译一次后运行Ok,如下: [root@test testmemcachedcpp]# ./testmemcached Save data:value sucessful! Get value:value sucessful! 少了一个删除成功的,简单调试一下: (gdb) n Get value:value sucessful! 50 rc=memcached_delete(memc,key.c_str(),key_length,expiration); (gdb) p key.c_str() $5 = 0x184372e8 "key" (gdb) p key_length $6 = 3 (gdb) n 51 if(rc==MEMCACHED_SUCCESS) (gdb) p rc $3 = MEMCACHED_INVALID_ARGUMENTS 也就是调这个函数的参数不对,返回不是MEMCACHED_SUCCESS,所以没有打印出:cout<<"Delete key:"<& value) { return memcached_success(memcached_add(memc_, key.c_str(), key.length(), &value[0], value.size(), 0, 0)); } 和php的add函数一样第一次运行时没有问题此时值设置成功,再运行add时一次就add不进去,add设置进去后,用set是能重新设置进去的,只是用add原子操作是不行的,用它来做锁很好使: 1)代码片段: //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) { cout<<"Add data:"< #include #include using namespace std; int main(int argc,char *argv[]) { //connect server memcached_st *memc; memcached_return rc; memcached_server_st *server; time_t expiration; uint32_t flags; memc = memcached_create(NULL); //server = memcached_server_list_append(NULL,"192.168.109.7",11211,&rc); server = memcached_server_list_append(NULL,"192.168.109.7",21211,&rc);//TTServer rc=memcached_server_push(memc,server); memcached_server_list_free(server); string key = "key"; string value = "value"; size_t value_length = value.length(); size_t key_length = key.length(); //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) { cout<<"Add data:"<