用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 对提升系统整体性能没意义。

Memcached java简单实例

最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的介绍下什么是m...
  • u012468540
  • u012468540
  • 2015-10-15 14:21:34
  • 2919

如何通过按钮使dateTimePicker的月份获得焦点

procedure TForm1.Button1Click(Sender: TObject);begin   postmessage(DateTimePicker1.handle,wm_keydown...
  • xiaomaoxia
  • xiaomaoxia
  • 2006-06-08 08:50:00
  • 1099

java代码链接memcached集群,操作实例

package com.yr.memcached.xml;   import com.danga.MemCached.MemCachedClient; import com.danga.MemC...
  • xll_csdn
  • xll_csdn
  • 2017-06-09 15:45:32
  • 303

memcached文本协议

以下是很早之前写的memcached文件协议介绍,重新发布一次。 考虑到memcached1.2与memcached1.1的协议有些不同,分别论述。 [返回的错误描述信息] 返回的错误描述信息分为三种...
  • kenbinzhang
  • kenbinzhang
  • 2009-10-20 15:07:00
  • 5001

muduo总结

总结说的有的过大,算是对自己学习的一个总结,后续会不断补充。 暂定为Reactor模型总结和使用的技术总结...
  • KangRoger
  • KangRoger
  • 2015-08-11 23:14:35
  • 2234

原来Muduo是一个人自己写的!!!

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网络库的使用。其设计与实现将有另文讲解。 由来 半年...
  • yusiguyuan
  • yusiguyuan
  • 2013-11-06 15:04:25
  • 3036

从零开始学写HTTP服务器(七)muduo+tinyhttpd

从零开始写HTTP服务器 使用muduo网络库和tinyhttpd
  • zhangxiao93
  • zhangxiao93
  • 2016-12-30 11:20:54
  • 812

muduo网络库学习笔记(14):chargen服务示例

通过muduo chargen服务示例来学习TcpConnection如何发送数据
  • Leeds1993
  • Leeds1993
  • 2016-11-22 17:02:04
  • 805

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

前段时间在一个go语言项目中用到memcached,在githup找到github.com/bradfitz/gomemcach,beego的cache中也用的这个,但是发现它只能存储最终的bytes...
  • qp2624
  • qp2624
  • 2016-03-22 23:46:35
  • 3883
收藏助手
不良信息举报
您举报文章:用muduo实现memcached协议的例子
举报原因:
原因补充:

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