最近花了两天时间用 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协议的例子的更多相关文章

  1. memcached协议

    memcached协议 旧版:http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt 新版:https://githu ...

  2. Mcrouter-基于Memcached协议的缓存层流量管理工具(Memcached集群的另一个选择)(转)

    Mcrouter 是一个基于Memcached协议的路由器,它是 Facebook缓存架构的核心组件,在峰值的时候,它能够处理每秒50亿次的请求.近日,Facebook开放了Mcrouter的源代码, ...

  3. memcached协议解析

    本文转载自:http://www.ccvita.com/306.html 协议memcached 的客户端使用TCP链接与服务器通讯.(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的 ...

  4. 利用TokyoTyrant构建兼容Memcached协议、支持故障转移、高并发的分布式Key-value持久存储系统(转)

    Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley D ...

  5. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

    最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...

  6. memcached协议解析 及使用

    本文转载自:http://www.ccvita.com/306.html 协议memcached 的客户端使用TCP链接与服务器通讯.(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的 ...

  7. memcached +mysql+php 例子

    <?php header("content-type:text/html;charset=utf-8"); $memcachehost = '127.0.0.1'; $mem ...

  8. UDP协议的例子

    public class Service { // 服务器         public static void main(String[] args) {               Datagra ...

  9. Memcached(四)Memcached的CAS协议

    1. 什么是CAS协议很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写.Google.com一下,CAS是 ...

随机推荐

  1. 用HttpWebRequest提交带验证码的网站

    using System; using System.Drawing; using System.IO; using System.Net; using System.Text; using Syst ...

  2. JS 取得一个区间的随机整数

    function rnd(n, m){        var random = Math.floor(Math.random()*(m-n+1)+n);        return random;   ...

  3. 再议C风格变量声明

    NeoRAGEx2002曾经有一篇文章提到这个问题,但是有很多内容并没有包括,例如const和__declspec. 最近我遇到一些这方面的问题,感觉有必要做一个系统性的总结.后来经过一些实验,得出了 ...

  4. jquery实现静态html文件的include嵌入效果

    //引入jQuery的js 建立footer.html,内容为要嵌入的内容. 在需要嵌入的页面中加入: $.get("footer.html",function(data){ $( ...

  5. AIX 环境下ODM库同步

    IBM AIX v5.3操作系统环境下有时会出现ODM库与rootvg硬盘上数据不同步的情况.使用命令lsvg -l datavg检查文件系统类型,发现显示为"???"这就表示OD ...

  6. Spark 2.6.1 源代码在 eclipse 的配置

    本文地址:http://www.cnblogs.com/jying/p/3671767.html 这么个问题又耗费了偶一天时间,真是羞愧.. 上午从官网svn地址下载最新的 spark 包,总是下载失 ...

  7. input[file]标签的accept=”image/*”属性响应很慢的解决办法

    转自:http://blog.csdn.net/lx583274568/article/details/52983693 input[file]标签的accept属性可用于指定上传文件的 MIME类型 ...

  8. Git保存密码

    TortoiseGit中,通过https方式连接时,默认是不会保存帐号密码,需要我们每次输入一次,真心很麻烦! 通过简单的设置,就可以解决这一问题! 编辑仓库目录中本地的”.git/config”文件 ...

  9. 数据库mysql优化方案

    1.创建索引对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致.如果不加索引的话,那么查找任何哪怕只是一条特定的数据 ...

  10. Endless Sky源码学习笔记-3

    文本解析: 将txt存入DataFile,DataFile包含DataNode,每个DataNode是txt中的一行,每个DataNode包含若干token(std::vector<string ...