用muduo实现memcached协议的例子

原创 2013年08月18日 13:00:26

用muduo实现memcached协议的例子

最近花了两天时间用 muduo 部分实现了 memcached 服务器协议,代码位于 examples/memcached/server,能通过 memcached 的大部分测试用例(incr/decr 还没有实现)。

这不是 memcached 的替代品(它没有实现LRU和超时功能,也没有实现二进制协议,更没有自己管理内存),而是一个网络编程的示例(代码只有 1000 行,比 memcached 小很多),展示 muduo 风格的事件驱动编程,以及将来性能优化的试验品(换句话说,现在这个版本完全没有在性能上做出任何努力)。读过 memcached 代码的人可以对比这两种编程风格的区别,memcached 的 read/write 操作穿插于正常逻辑处理,而 muduo 的网络数据读写是由库完成,应用程序只关心消息收发,目前二者的基本 get/set 操作的性能相当。

现在 muduo 的 inspector 内置了 gperftools 的远程 profiling 功能,memcached-debug 展示了其用法。

为什么不必优化 set 操作(含 set/add/update/append/prepend/cas 等)的性能?

1. 比例。既然是 memcache,那么 get:set 的比例很高,10:1 甚至更高,因此优化的重心应该是 get 而非 set。

假设 memcached 能处理 100k QPS,再假设这些操作都是 set(其实应该不到 10% 是 set),再假设所有的 set 都是串行执行的(没有并发),那么每次 set 的 CPU 时间不应该超过 10 us(含服务器本地的网络代码运行时间,但不含网络延迟)。而实际上一次 set 的 CPU 时间最多是 2~3 us (用 memcached-footprint 程序测得),根本不值得优化。

2. 网络带宽。假设一次 set 操作的 key + value 的长度是 1k bytes,TCP 的有效载荷带宽按110MB/s估算,那么1kB数据在千兆网上的惯性延迟是 9us(传输延迟是几十上百微秒,与此无关),也就是说服务器的网卡收到这 1kB 数据需要花 9us 时间(从第一个字节到达到服务器到收完最后一个字节),那么在 set 耗时 2~3 us 的情况下再去优化它是做无用功。

3. 产生“需要更新的数据”的成本远大于 memcached set 的开销。memcached 需要更新,往往是将已写入数据库的新数据放到 memcached 中,那么写数据库的开销远远大于 memcached set 的开销,优化 set 对提升系统整体性能没意义。

简单的程序诠释C++ STL算法系列之十二:find_end

C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。        find_en...

简单的程序诠释C++ STL算法系列之四:adjacent_find

C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。       adjacent...

Memcached协议解析及Go语言客户端实现

前段时间在一个go语言项目中用到memcached,在githup找到github.com/bradfitz/gomemcach,beego的cache中也用的这个,但是发现它只能存储最终的bytes...
  • qp2624
  • qp2624
  • 2016年03月22日 23:46
  • 3577

kestrel利用dubbo和memcached协议实现 队列服务

1.解压安装,kestrel-2.3.4.tar.gz 编写启动脚本,并启动。 start_kestrel.sh: #设置工作目录 WOKR_DIR=. #设置lib库目录 EXTEN_LIB_HO...

Muduo 网络编程示例之一:五个简单 TCP 协议

这是《Muduo 网络编程示例》系列的第一篇文章。本文将介绍五个简单 TCP 网络服务协议的 muduo 实现,包括 echo (RFC 862)、discard (RFC 863)、chargen ...
  • Solstice
  • Solstice
  • 2011年02月02日 12:59
  • 16101

TCP协议实现网络通信简单例子

TCP协议实现网络通信简单例子

用udp协议通讯示例 UDP实现广播接收回复的例子

一、绪言 udp是一种面向非连接,不可靠的通讯协议,相对于tcp来说,虽然可靠性不及,但传输效率较高。所以在网络上仍有很大的用途。这几日需要了解下udp通讯的过程,上网发现这方面的资料还挺少。于...

C++用纯虚函数实现协议委托的例子

C++不像其他很多编程语言有接口、委托或者协议的概念,但是利用纯虚函数和C++多重继承的特性,我们也能实现接口、委托或协议要做的事情,下面的通过一个人设置闹钟然后被闹钟唤醒的例子来说明如何在C++中实...

CakePHP下利用soap协议实现web service的例子

CakePHP下利用soap协议实现web service的例子

spi协议实现例子

  • 2013年03月26日 14:57
  • 120KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用muduo实现memcached协议的例子
举报原因:
原因补充:

(最多只允许输入30个字)