用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 对提升系统整体性能没意义。
用muduo实现memcached协议的例子的更多相关文章
- memcached协议
memcached协议 旧版:http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt 新版:https://githu ...
- Mcrouter-基于Memcached协议的缓存层流量管理工具(Memcached集群的另一个选择)(转)
Mcrouter 是一个基于Memcached协议的路由器,它是 Facebook缓存架构的核心组件,在峰值的时候,它能够处理每秒50亿次的请求.近日,Facebook开放了Mcrouter的源代码, ...
- memcached协议解析
本文转载自:http://www.ccvita.com/306.html 协议memcached 的客户端使用TCP链接与服务器通讯.(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的 ...
- 利用TokyoTyrant构建兼容Memcached协议、支持故障转移、高并发的分布式Key-value持久存储系统(转)
Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley D ...
- Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法
最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...
- memcached协议解析 及使用
本文转载自:http://www.ccvita.com/306.html 协议memcached 的客户端使用TCP链接与服务器通讯.(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的 ...
- memcached +mysql+php 例子
<?php header("content-type:text/html;charset=utf-8"); $memcachehost = '127.0.0.1'; $mem ...
- UDP协议的例子
public class Service { // 服务器 public static void main(String[] args) { Datagra ...
- Memcached(四)Memcached的CAS协议
1. 什么是CAS协议很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写.Google.com一下,CAS是 ...
随机推荐
- assert的用法
assert用来调试时,判断一个语句是否为真. assert是宏,而不是函数.在C的assert.h 头文件中. assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么 ...
- win7配置SMTP服务
有人说WIN7系统没有SMTP服务 怎么可能呢??? 具体安装步骤如下: 控制面板\程序>打开和关闭Windows功能 Internet信息服务 将 万维网服务>应用程序开发功能> ...
- 8.openssl req
数字证书申请和生成工具.也可以为根CA自行签署证书. 该命令中很多值.属性.格式或默认值都在config文件openssl.cnf中指定. [root@xuexi ~]# man req NAME r ...
- 升级SSH
本例使用CentOS6.6 原SSH版本为5.3P1 一.准备好需要升级到的新版本的软件包 openssh下载地址:http://www.openssh.com/portable.html#http ...
- jsp与数据库的连接
经过一段时间的学习与上网查资料,我已经成功的用java语言连接上了数据库, 本以为同理jsp跟数据库的连接肯定水到渠成的,但是在经过尝试很多次后我发现现实永远是骨感的,最终结果是花了一个下午的时间去建 ...
- python之路-Day8
抽象接口 class Alert(object): '''报警基类''' def send(self): raise NotImplementedError class MailAlert(Alert ...
- 掷骰子-IOS新手项目练习(抱歉,由于个人原因,图片没显示,要源码的项目私聊)
---恢复内容开始--- 今天我们来讲的就是项目<掷骰子> 首先我们先下载资源包,也就是我们需要的图片[点击图片下载] 在我们下载完图片之后,我们就可以开始创建项目 一.我们项目的做法可以 ...
- sql一个表中两个字段合并求和
sql一个表中两个字段,合并求和 SELECT SUM(字段a+'.'+字段b) as total from TABLE
- C++对象模型
1.类布局 1.1简单类对象的内存布局 class A { public: void f(); private: int i; char c; static int s; }; 简单对象的内存布局:非 ...
- iOS网络请求之multipart/form-data提交数据
multipart/form-data表单数据 在http网络请求中,post没有请求长度的限制,因为post把数据放在了body中,而不是像Get一样放在了浏览器的地址栏中(可以这么理解), 所以相 ...