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 plain​​​
​​​ copy​​

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 : 



[cpp] 
​​ view plain​​​
​​​ copy​​
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
12. {
13. #ifdef WIN32
14. WSADATA wsaData;
15. int
16. if
17. "Failed to start winsock."
18. return
19. }
20. #endif
21.
22. new
23.
24. try
25. {
26. if (pMemCacheClient->AddServer("192.168.21.23:22133"))
27. {
28. "Add server 192.168.21.23:22133 successful!"
29. }
30.
31.
32.
33. MemCacheClient::MemRequest cSetReqTest;
34. "TestSet";
35. "TestSet", sizeof("TestSet"));
36. if(pMemCacheClient->Set(cSetReqTest) == 1)
37. {
38. "Set TestSet->TestSet successful!"
39. }
40.
41. MemCacheClient::MemRequest cGetReqTest;
42. "TestSet";
43. if(pMemCacheClient->Get(cGetReqTest) == 1)
44. {
45. "Get TestSet->TestSet successful!"
46. }
47.
48. std::string sResult(cGetReqTest.mData.GetReadBuffer(), cGetReqTest.mData.GetReadSize());
49. "Get:"
50. }
51. catch(std::exception &e)
52. {
53. "Exception:"
54. }
55.
56. delete
57.
58. return
59. };



[plain] 
​​ view plain​​​
​​​ copy​​
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。