设为首页 收藏本站
查看: 1098|回复: 0

[经验分享] 自己实现memcached客户端库

[复制链接]

尚未签到

发表于 2015-9-2 08:49:32 | 显示全部楼层 |阅读模式
What's memcached ?   memcached是一个以key-value的形式缓存数据的缓存系统。通过将数据缓存到内存中,从而提高数据的获取速度。
  memcached以key-value的形式来保存数据,你可以为你每一段数据关联一个key,然后以后可以通过这个key获取
  这段数据。
    memcached是一个库还是什么?memcached其实是一个单独的网络服务器程序。它的网络底层基于libevent,你可以
  将其运行在网络中的一台服务器上,通过网络,在遵循memcached的协议的基础上与memcached服务器进行通信。
  What do we want to wrap ?
  我们需要做什么?我们只需要遵循memcached的协议(参见该文档),封装网络层的通信,让上层可以通过调用诸如
  add/get之类的接口即可实现往memcached服务器缓存数据,以及取数据。上层程序员根本不知道这些数据在网络
  上存在过。
  这个东西,也就是memcached官方所谓的client apis。你可以使用现成的客户端库,但是你也可以将这种重造轮子
    的工作当作一次网络编程的练习。it's up to you.:D
  Where to start ?
  很遗憾,对于windows用户而言,memcached官方没有给出一个可以执行或者可以直接F7即可得到可执行文件的下载
  (如果你是vc用户)。幸运的是,已经有人做了这个转换工作。
  你可以从http://jehiah.cz/projects/memcached-win32/这里下载到memcached的windows版本,包括可执行程序和
  源代码。
  我们直接可以运行memcached.exe来安装/开启memcached服务器,具体步骤在以上页面有所提及:
DSC0000.gif 安装:memcached.exe-dinstall,这会在windows服务里添加一个memcached服务
行:memcached.exe-dstart,你也可以通过windows的服务管理运行。

  然后,你可以在任务管理器里看到一个'memcached'的进程,很占内存,因为这是memcached。
  So, here we go ...
  通过以上步骤运行的memcached,默认在11211端口监听(是个TCP连接,可以通过netstat查看)。接下来,我们就可
  以connect到该端口上,然后send/recv数据了。发送/接收数据只要遵循memcached的协议格式,一切都很简单。
  使用最简单的阻塞socket连接memcached服务器:
  
    SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );
    struct sockaddr_in addr;
    memset( &addr, 0, sizeof( addr ) );
    addr.sin_family = AF_INET;
    addr.sin_port = htons( 11211 );
    addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
      ret = connect( s, (struct sockaddr*) &addr, sizeof( addr ) );
    if( ret == 0 )
    {
      printf( "connect okn" );
    }
  About the protocol
  简单地提一下memcached的协议。
  可以说,memcached的协议是基于行的协议,因为无论是客户端请求还是服务器端应答,都是以"rn"作为结束符。
memcached的协议将数据(send/recv操作的数据)分为两种类型:命令和用户数据。
  命令用于服务器和客户端进行交互;而用户数据,很显然,就是用户想要缓存的数据。
    关于用户数据,你只需要将其编码成字节流(说白了,只要send函数允许即可),并附带数据结束标志"rn"发送即可。
  关于命令,memcached分为如下几种命令:存储数据、删除数据、取出数据、其他一些获取信息的命令。其实你换个角度
  想想,memcached主要就是将数据存储到内存里,所以命令也多不了哪去,基本就停留在add/get/del上。
  关于key,memcached用key来标识数据,每一个key都是一个不超过255个字符的字符串。
  到这里,你可以发现memcached对于数据的存储方式(暴露给上层)多少有点像std::map,如果你愿意,你可以将客户端
  API封装成map形式。= =#
  具体实现
  接下来可以看看具体的实现了。
  首先看看存储数据命令,存储数据命令有:add/set/replace/append/prepend/cas。存储命令的格式为:
  <command name> <key> <flags> <exptime> <bytes> [noreply]rn
  具体字段的含义参看protocol.txt文件,这里我对set举例,如下代码,阻塞发送即可:
      charcmd[256];
    chardata[]="testdata";
    sprintf(cmd,"setTestKey00%drn",strlen(data));
    ret=send(s,cmd,strlen(cmd),0);

    注意:noreply选项对于有些memcached版本并不被支持,例如我们使用的1.2.2版本。注意官方的changelog即可。
  当你发送了存储命令后,memcached会等待客户端发送数据块。所以我们继续发送数据块:
      ret=send(s,data,strlen(data),0);
    ret=send(s,"rn",2,0);//数据结束符
  然后,正常的话,memcached服务器会返回应答信息给客户端。
      charreply[256];
    ret=recv(s,reply,sizeof(reply)-1,0);
    reply[ret]=0;
    printf("serverreply:%sn",reply);
  如果存储成功,服务器会返回STORED字符串。memcached所有应答信息都是以字符串的形式给出的。所以可以直接printf出来。
  关于其他的操作,我就不在这里列举例子了。我提供了我封装的memcached客户端库的完整代码下载,使用的是阻塞socket,
  对应着memcached的协议看,很容易看懂的。
  It's a story about a programmer...
  
  最近发觉自己有点极端,要么写纯C的代码,要么写满是template的泛型代码。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-108560-1-1.html 上篇帖子: Memcached的安装及应用 下篇帖子: Windows XP Memcached 的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表