艾伟:自己实现memcached客户端库
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服务器,具体步骤在以上页面有所提及:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
然后,你可以在任务管理器里看到一个'memcached'的进程,很占内存,因为这是memcached。
So, here we go ...
通过以上步骤运行的memcached,默认在11211端口监听(是个TCP连接,可以通过netstat查看)。接下来,我们就可
以connect到该端口上,然后send/recv数据了。发送/接收数据只要遵循memcached的协议格式,一切都很简单。
使用最简单的阻塞socket连接memcached服务器:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cppblog.com/Images/dot.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
About the protocol
简单地提一下memcached的协议。
可以说,memcached的协议是基于行的协议,因为无论是客户端请求还是服务器端应答,都是以"\r\n"作为结束符。
memcached的协议将数据(send/recv操作的数据)分为两种类型:命令和用户数据。
命令用于服务器和客户端进行交互;而用户数据,很显然,就是用户想要缓存的数据。
关于用户数据,你只需要将其编码成字节流(说白了,只要send函数允许即可),并附带数据结束标志"\r\n"发送即可。
关于命令,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]\r\n
具体字段的含义参看protocol.txt文件,这里我对set举例,如下代码,阻塞发送即可:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
注意:noreply选项对于有些memcached版本并不被支持,例如我们使用的1.2.2版本。注意官方的changelog即可。
当你发送了存储命令后,memcached会等待客户端发送数据块。所以我们继续发送数据块:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
然后,正常的话,memcached服务器会返回应答信息给客户端。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
如果存储成功,服务器会返回STORED字符串。memcached所有应答信息都是以字符串的形式给出的。所以可以直接printf出来。
关于其他的操作,我就不在这里列举例子了。我提供了我封装的memcached客户端库的完整代码下载,使用的是阻塞socket,
对应着memcached的协议看,很容易看懂的。
It's a story about a programmer...
最近发觉自己有点极端,要么写纯C的代码,要么写满是template的泛型代码。
相关代码下载
艾伟:自己实现memcached客户端库相关推荐
- 基于java nio的memcached客户端——xmemcached
1.xmemcached是什么? xmemcached是基于java nio实现的memcached客户端API. 实际上是基于我实现的一个简单nio框架 http://code.google.com ...
- 跨平台 C/C++ memcached 客户端 memcacheclient 介绍
1.简介 C/C++ memcached 客户端首推 libmemcached,但是其并不兼容 Windows 下 VC++ 编译器.在 google code 的 memcached wiki 有 ...
- linux下载python的es库,Elasticsearch py客户端库安装及使用方法解析
一.介绍 elasticsearch-py是一个官方提供的low-level的elasticsearch python客户端库.为什么说它是一个low-level的客户端库呢?因为它只是对elasti ...
- 功能强大的 C++ redis 客户端库增加至 acl 项目中
虽然 redis 开发库已有不少,但 C/C++ 的客户端库好用的并不多,虽然官方也提供了 C 版的客户端库,但易用性较差,而且不支持连接池功能,相对于 C/C++ 的库,JAVA 版的 jedis ...
- Memcached 客户端使用
Memcached 客户端使用 网上摘抄,以备后用 package com.test.memcache; import java.util.Date; import com.danga.MemCac ...
- java azure blob 查询_快速入门:适用于 Java 的 Azure Blob 存储客户端库 v8 | Microsoft Docs...
您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 快速入门:使用 Jav ...
- 【Alljoyn】 Alljoyn学习笔记七 Alljoyn瘦客户端库介绍
Alljoyn瘦客户端库介绍(上) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设 ...
- zookeeper客户端库curator分析
zookeeper客户端库curator分析 前言 综述 zookeeper保证 理解zookeeper的顺序一致性 之前使用zookeeper客户端踩到的坑 curator 连接保证 连接状态监控以 ...
- Oracle 客户端库时引发 BadImageFormatException
为什么80%的码农都做不了架构师?>>> 具体错误信息: 尝试加载 Oracle 客户端库时引发 BadImageFormatException.如果在安装 32 位 Orac ...
最新文章
- 花了一个星期,我终于把RPC框架整明白了!
- 如何创建和维护你自己的man手册
- 多波次导弹发射中的规划问题(二) 问题一解答
- |洛谷|分治|P2799 国王的魔镜
- 北斗导航 | 卫星导航基础知识(卫星通信调制技术:信号调制、解调:ASK、FSK、PSK:FDMA、TDMA、CDMA、SDMA)
- System.Net.WebException: The operation has timed out at System.Net.HttpWebRequest.GetResponse()
- springboot小笔记
- HH SaaS电商系统移动端商城,买家选择商品规格的交互设计
- 复旦大学长跑协会财务制度(初稿)
- javascript学习系列(10):数组中的slice方法
- 4.2号 作业讲解
- 子类构造器Constructor是否可被Override(重写)
- 实战OO设计——类的关系:依赖、关联、聚合和组合
- unix域套接字UDP网络编程
- 网络通信原理之TCP,UDP,QUIC
- 在SQL Server2012上搭建Northwind详细教程,SQL2000SampleDb.msi的资源
- Oracle表被锁死如何解锁
- Linux link命令
- 分享网站变黑白色代码整站灰色插件方法
- 企业知识、经验如何传承?知识管理系统告诉你
热门文章
- php百度地图地址解析失败,javascript - vue中使用百度地图 提示无法解析
- denied git permission_Git使用之Permission Denied问题解决[2153-Noblog]
- oa中获取当前用户信息
- VB 判断当前是否连接网络API实现
- VB取得TextBox、RichTextBox光标所在的行和列(支持汉字)
- 让画面更逼真!这个强化超分辨率GAN让老游戏迎来第二春 | 代码+论文+游戏MOD...
- 刚刚卸任的谷歌搜索及AI负责人,被苹果挖走了
- 索尼入局日本打车市场,联合6家出租车公司推AI打车软件
- send和sendmsg性能测试
- Javascript下拉刷新