memcache研究

jopen 11年前發布 | 19K 次閱讀 緩存服務器 memcached Memcache

memcached是一個高性能,分布式的內存緩存服務器,通過內存的數據訪問來降低對數據庫的訪問,從而提高動態內容應用網站的速度。

memcached的特征:

1) 基于C/S架構,協議簡單;

2) 基于libevent的事件處理;使用libevent進行網絡并發連接的處理,能夠保持在很大并發情況下,保持快速的相應能力。

3) 內置內存存儲方式;數據存儲方式使用Slab Allocation,數據過期方式采用:Lazy Expiration +LRU

4) 基于客戶端的memcached分布式;

其他的具體的細節可以參考其他參考文檔,這里不細說。如果以后深入研究了,會展開分析。

下面看看怎么安裝memcached以及怎么安裝客戶端,及使用C++代碼進行測試

1. memcached安裝

安裝步驟:

(1)  由于memcached是基于libevent的時間處理,所以安裝前先安裝libevent,可以從官方網站下載,http://monkey.org/~provos/libevent/,我使用的安裝版本是:libevent-1.3.tar.gz

(2)  安裝memcached主程序,可以從官網下載:http://www.danga.com/memcached,我使用的版本是:memcached-1.2.2.tar.gz

(3)  我這里使用的C/C++ memcached 客戶端庫:libmemcached,可以從開發庫官網下載:http://tangent.org/552/libmemcached.html,我使用的版本是:libmemcached-0.42.tar.gz

說明:這些資料可以在我的資源空間免費下載:http://download.csdn.net/detail/feitianxuxue/5739345

安裝libevent

解壓文件:tar –zxvf libevent-1.3.tar.gz,進入目錄:cd libevent-1.3

預編譯: ./configure --prefix=/usr (路徑可以自己配)

編譯和安裝:make && make install

測試是否安裝成功: ls -al /usr/lib | grep libevent

顯示:

lrwxrwxrwx   1 root root       21 07-09 22:14 libevent-1.3.so.1 -> libevent-1.3.so.1.0.3

-rwxr-xr-x   1 root root   337676 07-09 22:14 libevent-1.3.so.1.0.3

-rw-r--r--   1 root root   532580 07-09 22:14 libevent.a

-rwxr-xr-x   1 root root      805 07-09 22:14 libevent.la

lrwxrwxrwx   1 root root       21 07-09 22:14 libevent.so -> libevent-1.3.so.1.0.3

安裝memcached

解壓文件:tar –zxvf memcached-1.2.2.tar.gz,進入目錄: cd memcached-1.2.2

預編譯: ./configure --with-libevent=/usr(該路徑參考libevent的安裝路徑)

編譯和安裝:make && make install

安裝完畢后,會存放默認路徑: /usr/local/bin/memcached

測試是否安裝成功:ls -al /usr/local/bin/mem*

-rwxr-xr-x 1 root root 142346 07-11 09:27 /usr/local/bin/memcached

-rwxr-xr-x 1 root root 152004 07-11 09:27 /usr/local/bin/memcached-debug

安裝C/C++ memcached 客戶端庫:libmemcached

解壓文件:tar –zxvf libmemcached-0.42.tar.gz,進入目錄: cd  libmemcached-0.42

預編譯: ./configure --prefix=/usr (路徑可以自己配)

編譯和安裝:make && make install

測試是否安裝成功:

檢查庫文件:ls /usr/lib/libmemcache*

檢查頭文件:ls /usr/include/libmemcached/*

檢查命令行工具:ls /usr/bin/mem*

自此,所有的庫都安裝好了,可以開始工作了

2. 啟動memcached服務端

進入:cd  /usr/local/bin/,可以利用./memcached –h看到一些幫助信息

運行:./memcached -u root –d,這里-d選項是啟動一個守護進程,-u是運行Memcache的用戶

默認啟動TCP端口是:11211

可以查看程序運行:ps -ef|grep memcached

root      2992     1  0 11:20 ?        00:00:00 ./memcached -u root –d

3.  一個簡單的C++測試程序,

用于連接memcached服務器,添加一條記錄,獲取一條記錄,刪除一條記錄。

代碼如下:test.cpp

    #include <iostream>

#include <string>  
#include <libmemcached/memcached.h>  

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:"<<value<<" sucessful!"<<endl;  
      }  
    
      //Get data  
      char* result = memcached_get(memc,key.c_str(),key_length,&value_length,&flags,&rc);  
      if(rc == MEMCACHED_SUCCESS)  
      {  
          cout<<"Get value:"<<result<<" sucessful!"<<endl;  
      }  
    
      //Delete data  
      rc=memcached_delete(memc,key.c_str(),key_length,expiration);  
      if(rc==MEMCACHED_SUCCESS)  
      {  
          cout<<"Delete key:"<<key<<" sucessful!"<<endl;  
      }  
    
      //free  
      memcached_free(memc);  
      return 0;  
  }  </pre></span> <p></p>

編譯:g++ test.cpp –o test –lmemcached

運行:[root@localhost test]# ./test1 

可能會報錯:./test1: error while loading shared libraries: libmemcached.so.5: cannot open shared object file: No such file or directory

"error while loading shared libraries:x.so.x"錯誤:

原因:執行某些外部程序的時候可能會提示找不到共享庫的錯誤

1) 操作系統里確實沒有包含該共享庫(lib*.so.*文件)或者共享庫版本不對遇到這種情況那就去網上下載并安裝上即可.
2) 已經安裝了該共享庫但執行需要調用該共享庫的程序的時候程序按照默認共享庫路徑找不到該共享庫文件. 

解決方法:

1如果共享庫文件安裝到了其它"/lib/usr/lib" 目錄下,  但是又不想在/etc/ld.so.conf中加路徑(或者是沒有權限加路徑). 那可以export一個全局變量LD_LIBRARY_PATH, 然后運行程序的時候就會去這個目錄中找共享庫. 
LD_LIBRARY_PATH的意思是告訴loader在哪些目錄中可以找到共享庫可以設置多個搜索目錄這些目錄之間用冒號分隔開比如安裝了一個mysql/usr/local/mysql目錄下其中有一大堆庫文件在/usr/local/mysql/lib下面則可以在.bashrc.bash_profileshell里加入以下語句即可:
export LD_LIBRARY_PATH=/usr/local//lib:$LD_LIBRARY_PATH     export LD_LIBRARY_PATH=/usr/lib

2 如果共享庫文件安裝到了/lib/usr/lib目錄下那么需執行一下ldconfig命令

3如果共享庫文件安裝到了/usr/local/lib(很多開源的共享庫都會安裝到該目錄下)或其它"/lib/usr/lib"目錄下那么在執行ldconfig命令前還要把新共享庫目錄加入到共享庫配置文件/etc/ld.so.conf如下:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf

 echo "/usr/local/lib" >> /etc/ld.so.conf

 ldconfig</p>

 

結果:

Save data:value sucessful!

Get value:value sucessful!

Delete key:key sucessful!

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!