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_profile或shell里加入以下語句即可:
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!