memcached的学习(3)

2018.6.12
今天开始安装memcached的客户端,memcached服务器端不能互相通信,那么实际分布式的概念是由客户端来完成的,学习目的安装并了解客户端。

1、基本了解

memcached本身是一个集中式的内存缓存系统,对于分布式的支持服务端并没有实现,只有通过客户端实现;再者,memcached是基于TCP/UDP进行通信,只要客户端语言支持TCP/UDP即可实现客户端,并且可以根据需要进行功能扩展。

许多语言都实现了连接memcached的客户端,其中以Perl、PHP为主。 仅仅memcached网站上列出的语言就有:

● Perl
● PHP
● Python
● Ruby
● C#
● C/C++
● Lua
等等。

memcached客户端API:http://www.danga.com/memcached/apis.bml
这里介绍通过mixi正在使用的Perl库链接memcached的方法。
使用Cache::Memcached
Perl的memcached客户端有

● Cache::Memcached
● Cache::Memcached::Fast
Cache::Memcached::libmemcached

考虑到编程语言的了解程度,这里我们打算研究的是memcached::libmemecached客户端,这应该是个客户端的库,使用这个库可以直接连接到memcacehed的服务器端上。

2、libmemecached客户端的安装

1.下载

在命令行下: wget https://launchpad.net/libmemcached/1.0/1.0.7/+download/libmemcached-1.0.7.tar.gz 下载文件。

2.下载依赖包

输入sudo apt-get install libevent-dev 安装libevent-dev (据说这个很重要,不然libmemcached就不能运行,最好安装)

3. 解压缩下载文件

sudu tar -zxvf libmemcached-1.0.7.tar.gz

4. 编译:

./configure

5. 输入:

make

这里很可能会出下面错误:

libmemcached/backtrace.cc: In function 'void custom_backtrace()':
libmemcached/backtrace.cc:57:6: sorry, unimplemented: Graphite loop optimizations can only be used if the libcloog-ppl0 package is installed

解决办法是修改Makefile,查找并去掉 floop-parallelize-all(应该有两处需要去掉),看了网上资料说是去掉后表示不使用Graphite loop 优化。成功编译。

6. 安装:

make install

7. 编写文件 MemCachedClient.h 输入下面内容:
  1. #ifndef MEMCACHEDCLIENT  
  2.   
  3. #define MEMCACHEDCLIENT   
  4.   
  5. #include <libmemcached/memcached.h>  
  6. #include<iostream>  
  7. #include<string.h>  
  8. #include<time.h>  
  9. #include <stdlib.h>  
  10. #include <stdio.h>  
  11.   
  12. using std::string;  
  13. using std::cout;  
  14. using std::endl;  
  15.   
  16. class MemCachedClient  
  17. {     
  18. public:  
  19.         ~MemCachedClient()  
  20.         {  
  21.             memcached_free(memc);  
  22.         };  
  23.   
  24.         MemCachedClient()  
  25.         {  
  26.             memcached_return rc;                                                                     
  27.             memcached_server_st *server = NULL;  
  28.             memc = memcached_create(NULL);  
  29.               
  30.             server =memcached_server_list_append(server, "127.0.0.1", 11211, &rc);  
  31.             rc=memcached_server_push(memc,server);                                           
  32.   
  33.             if (MEMCACHED_SUCCESS != rc)                                                                           {  
  34.                  cout <<"memcached_server_push failed! rc: " << rc << endl;  
  35.             }  
  36.   
  37.             memcached_server_list_free(server);  
  38.         };  
  39.   
  40.         int Insert(const char* key, const char* value,time_t expiration = 3)  
  41.         {  
  42.             if (NULL == key || NULL == value)  
  43.             {    
  44.                 return -1;  
  45.             }  
  46.               
  47.             uint32_t flags = 0;  
  48.   
  49.             memcached_return rc;  
  50.             rc = memcached_set(memc, key, strlen(key),value, strlen(value), expiration, flags);  
  51.   
  52.             // insert ok  
  53.             if (MEMCACHED_SUCCESS == rc)  
  54.             {  
  55.                 return 1;  
  56.             }  
  57.             else  
  58.             {  
  59.                 return 0;  
  60.             }  
  61.         };  
  62.            
  63.           
  64.         string Get(const char* key)  
  65.         {  
  66.              if (NULL == key)  
  67.              {    
  68.                 return "no key";  
  69.              }  
  70.   
  71.             uint32_t flags = 0;  
  72.   
  73.             memcached_return rc;  
  74.   
  75.             size_t value_length;  
  76.             char* value = memcached_get(memc, key, strlen(key), &value_length, &flags, &rc);  
  77.   
  78.             // get ok  
  79.             if(rc == MEMCACHED_SUCCESS)  
  80.             {    
  81.                 return value;  
  82.             }  
  83.   
  84.             return "no value";  
  85.         };  
  86.   
  87.     private:  
  88.         memcached_st* memc;                                                                   
  89. };  
  90.   
  91. #endif  

cc 文件 test.cc

  1. #include<iostream>  
  2. #include"MemCachedClient.h"  
  3.   
  4. using std::cout;  
  5. using std::endl;  
  6.   
  7. int main()  
  8. {  
  9.     MemCachedClient mc;  
  10.     int result = mc.Insert("mem_key","/view/index?name=Jame");     
  11.     string get_value =  mc.Get("mem_key");  
  12.       
  13.     cout << "get_value: " << get_value << endl;  
  14.     return 1;  
  15. };  

最后形成测试文件如下:
在这里插入图片描述

8、为了方便编译,写了编译及运行测试脚本

在这里插入图片描述

9、为了方便也可以模仿写makefile文件

在这里插入图片描述

安装问题:

error while loading shared libraries: libmemcached.so.3: cannot open shared object file: No such file or directory

用这个作为标题是因为想让那些遇到同样问题的人能更加快速的找到这里。

这个问题是源于我在安装了libmemcached后,运行在/usr/local/bin/memstat的命令时产生的。原因是没有找到那个动态链接库 libmemcached.so.3,原因是系统在找这些动态链接库的时候默认只是去找/lib和/usr/lib目录下的,但是这个 libmemcached.so.3文件在安装完以后产生在/usr/local/lib, 所以没找到

解决办法:

1. 在/etc/profile文件里面添加
LD_LIBRARY_PATH=/usr/local/lib; export LD_LIBRARY_PATH

利用环境变量解决这个问题。

2. (需要root权限)在/etc/ld.so.conf 文件中添加一句:
/usr/local/lib

然后运行ldconfig命令,或者设置软连接

执行时会报错:

libmemcached.so.10: cannot open shared object file: No such file or director

原因是 libmemcached.so.10 被安装到了 /usr/local/lib下,而共享库默认位置是 /usr/lib 网上说可以把目录 /usr/local/lib 设置到环境变量,但我设置完后不起作用。

于是用建立一个链接:

ln /usr/local/lib/libmemcached.so.10  /usr/lib/libmemcached.so.10 

思考:

安装完成了服务器端和客户端,接下来的问题是,客户端貌似是提供了一个库文件给用户执行memcahed的操作,服务器端是对应的缓存算法。客户端需要自己完成分布式的相关内容。
所以接下来的工作:

1、了解memcached的常用操作
2、连接客户端的API
3、连接服务器端的内存缓存管理
4、了解客户端的分布式知识

猜你喜欢

转载自blog.csdn.net/u012414189/article/details/84289297
今日推荐