跨平臺 C/C++ memcached 客戶端 memcacheclient 介紹

工程師WWW發表於2013-12-24

1、簡介

    C/C++ memcached 客戶端首推 libmemcached,但是其並不相容 Windows 下 VC++ 編譯器。在 google code 的 memcached wiki 有關於 memcacheclient 的簡介“memcacheclient——cross-platform, but primary focus on Windows (last updated in 2008)”。在 memcacheclient 專案頁面發現該專案於 2012 年更新過,值得試用。

2、環境&軟體準備

      memcacheclient-2.0 : http://code.jellycan.com/files/memcacheclient-2.0.zip

3、安裝&&配置


Windows

    windows,你懂的。解壓,雙擊 sln,生成解決方案。看到 Debug 目錄下面生成了 MemCacheClient.lib 就 OK 了。VS 配置一下 VC++ 目錄即可。

Linux

    Linux 下,解壓,make 即可。不過,原始的 Makefile 只生成 MemCacheClientTest 這麼個怪東西,也就是生成個測試程式,沒有生成庫檔案。可以替換成下面的 Makefile,用以生成靜態庫檔案。
[plain] view plaincopy
  1. CC=g++  
  2. AR=ar  
  3. ARFLAGS=-rcs  
  4. CFLAGS=-Wall  
  5. CPPFLAGS=-Wall  
  6. LIBS=-lrt  
  7.   
  8. LIB_OBJS=MemCacheClient.o ReadWriteBuffer.o Socket.o Matilda.o sha1.o  
  9.   
  10. OBJS=MemCacheClientTest.o MemCacheClient.o ReadWriteBuffer.o Socket.o Matilda.o sha1.o  
  11.   
  12. all: $(OBJS)  
  13.     $(CC) -o MemCacheClientTest $(OBJS) $(LIBS)  
  14.     $(AR) $(ARFLAGS) libMemCacheClient.a $(LIB_OBJS)  
  15.     mkdir lib  
  16.     mv libMemCacheClient.a lib   
  17.   
  18. clean:  
  19.     rm -rf core *.o lib MemCacheClientTest  
  20.   
  21. install:  
  22.     @echo No install provided. Include the source files in your project.  
  23.   
  24. MemCacheClientTest.o : MemCacheClientTest.cpp  
  25. MemCacheClient.o : MemCacheClient.cpp MemCacheClient.h  
  26. ReadWriteBuffer.o : ReadWriteBuffer.cpp ReadWriteBuffer.h  
  27. md5.o : md5.c md5.h  
 在 lib 目錄生成 libMemCacheClient.a 即可。配置一下環境變數。

4、測試


MemcacheClientTest.cpp : 
  1. #include <iostream>  
  2.   
  3. #ifdef WIN32  
  4. # include <winsock2.h>  
  5. # pragma comment(lib, "ws2_32.lib")  
  6. #endif  
  7.   
  8. #include <MemCacheClient.h>  
  9. //#include <ReadWriteBuffer.h>  
  10.   
  11. int main(int argc, char *argv[])  
  12. {  
  13. #ifdef WIN32  
  14.     WSADATA wsaData;  
  15.     int rc = WSAStartup(MAKEWORD(2,0), &wsaData);  
  16.     if (rc != 0) {  
  17.         std::cout << "Failed to start winsock." << std::endl;  
  18.         return 1;  
  19.     }  
  20. #endif  
  21.       
  22.     MemCacheClient *pMemCacheClient = new MemCacheClient;  
  23.   
  24.     try  
  25.     {  
  26.         if (pMemCacheClient->AddServer("192.168.21.23:22133"))  
  27.         {  
  28.             std::cout << "Add server 192.168.21.23:22133 successful!" << std::endl;  
  29.         }  
  30.   
  31.           
  32.   
  33.         MemCacheClient::MemRequest cSetReqTest;  
  34.         cSetReqTest.mKey = "TestSet";  
  35.         cSetReqTest.mData.WriteBytes("TestSet"sizeof("TestSet"));  
  36.         if(pMemCacheClient->Set(cSetReqTest) == 1)  
  37.         {  
  38.             std::cout << "Set TestSet->TestSet successful!" << std::endl;  
  39.         }  
  40.   
  41.         MemCacheClient::MemRequest cGetReqTest;  
  42.         cGetReqTest.mKey = "TestSet";  
  43.         if(pMemCacheClient->Get(cGetReqTest) == 1)  
  44.         {  
  45.             std::cout << "Get TestSet->TestSet successful!" << std::endl;  
  46.         }  
  47.   
  48.         std::string sResult(cGetReqTest.mData.GetReadBuffer(), cGetReqTest.mData.GetReadSize());  
  49.         std::cout << "Get:" << sResult << std::endl;  
  50.     }  
  51.     catch(std::exception &e)  
  52.     {  
  53.         std::cerr << "Exception:" << e.what() << std::endl;  
  54.     }  
  55.   
  56.     delete pMemCacheClient;  
  57.   
  58.     return 0;  
  59. };  

Makefile:
[plain] view plaincopy
  1. CC=g++  
  2. CPPFLAGS=-Wall -I$(MEMCACHECLIENT_ROOT)  
  3. LDFLAGS=-L$(MEMCACHECLIENT_ROOT)/lib -lMemCacheClient -lrt  
  4.   
  5. OBJS=MemcacheClientTest.o  
  6.   
  7. all : $(OBJS)  
  8.     $(CC) -o MemcacheClientTest $(OBJS) $(LDFLAGS)  
  9.   
  10. MemcacheClientTest.o : MemcacheClientTest.cpp  
  11.     $(CC) $(CPPFLAGS) -c MemcacheClientTest.cpp  
  12.   
  13. clean :   
  14.     rm -rf *.o MemcacheClientTest  
完整的測試工程檔案,見 MemCacheClientTest.zip

總結

    在 Windows 下確實很難找到比 memcacheclient 更方便的 memcached 客戶端了(也可能是我孤陋寡聞^_^)。其介面貌似也比較接近舊版的 libmemcached,介面還算簡潔。不過,用的人還是少,沒有深入研讀原始碼,還是不要在關鍵專案中使用(過河拆橋,罪過啊)。反正我是再封裝了一層,Windows 下基於 memcacheclient,linux 下基於 libmemcached。


編輯記錄
    V 1.0.1    新增完整測試工程檔案下載地址
    V 1.0    初稿

相關文章