memcached源码分析-----安装、调试以及如何阅读memcached源码

        转载请注明出处:http://blog.csdn.net/luotuo44/article/details/42639131

安装:

安装memcached之前要先安装Libevent。现在假定Libevent安装在/usr/local/libevent目录了。

因为memcached安装后不像Libevent那样,有一堆头文件和库文件。安装后的memcached不是用来编程而直接用来运行的。所以不需要在/usr/local目录下专门为memcached建立一个目录。直接把memcached安装到/usr/local即可。

在Linux中解压memcached-1.4.21.tar.gz,然后进入解压后的目录。输入命令下面命令进行配置安装。

$./configure --with-libevent=/usr/local/libevent

$make

$sudo make install

memcached的默认安装目录就是/usr/local,如果想安装在自己的目录,那么可以configure的时候用--prefix=xxx指定一个目录。--with-libevent就是用来指明Libevent的安装目录的。

如果安装目录是/usr/local那么现在可以memcached这个可执行程序了,直接在命令行输入memcached即可,并且此时可以使用命令$man memcached查询帮助手册。

假如是安装在其他目录,比如/usr/local/memcached目录,那么还需要一些配置。首先要配置可执行文件的查找目录,需要修改PATH环境变量。在/etc/bash.bashrc文件最后添加:

exportPATH=$PATH:/usr/local/memcached/bin

此时,就可以在shell中能运行memcached命令了。但还不能使用man来查询memcached的帮助手册。因为该命令的帮助手册没有在man的查询目录上。在/usr/local/memcached/share/man/man1目录中,有一个memcached.1文件。把这个文件拷贝到/usr/local/share/man/man1目录下。此时就可以man 这个memcached了。

调试:

如果已经安装了memcached,那么先使用$sudo make uninstall命令进行卸载。configure 配置和前面一样,不需要改变。然后输入下面命令生成debug版本的memcached。

$make  CFLAGS="-g -O0"

$sudo make install

这样就行了。然后直接是shell里面输入$gdb memcached命令启动memcached。至于memcached的参数是在启动gdb之后,使用run命令的时候才输入的。如下图所示:

要记得先设置断点,然后才使用r或者run命令。

启动命令:

简单的启动命令如下,设置-l和-p分别用来设置ip和监听的端口。-vv是输出一些运行信息。

$memcached  -l 192.168.1.112  -p 8888  -vv

和libevent的关系:

memcached依赖于libevent。从memcached的编译就可以知道。阅读memcached的代码需要懂得libevent的基本使用,关于libevent的使用例子可以参考《Libevent使用例子,从简单到复杂》。当然阅读memcached源码并不需要阅读libevent源码作为基础,懂得libevent的基本使用即可。假如读者想阅读libevent的源代码,可以参考《libevent源码分析》系列文章。

和libevent源码阅读的难度比较:

虽然memcached的代码量比libevent少很多,但阅读起来却比libevent难很多。主要原因有:memcached使用了大量的全局变量;各个模块之间的关联性很强;使用了大量的锁和很多线程。而libevent的各个模块独立得比较好,模块间关联很少,基本上是各个模块完成自己独立的功能,然后向外界提供使用接口。所以阅读memcached的代码更要耐心。另外,阅读memcached源码除了需要会用libevent外还需要懂得多线程、socket、管道等等东西的基本使用。当然如果看过《UNIX环境高级编程》那么就没有问题了。

如何阅读memcached源代码:

1.找一篇概括性描述memcached的文章。了解memcached使用了哪些技术以及memcached内部的各个模块(比如内部有哈希表、slab内存分配器、LRU队列、半同步半异步等等)。一个日本人写的《memcached完全剖析》可以看一下,里面并没有涉及到代码只是简单介绍memcached。

2.分模块阅读代码,可以单独阅读slabs.c文件、assoc.c文件、items.c文件。看完一个模块的基本功能后,再阅读另外一个模块的。记住,不要想一次就把整个模块完全看懂。memcached模块间关联太大的,不可能一次性看懂的。要经常回过头看之前看过的模块,特别是看到了一些相关联的东西(比如全局变量)。

3.虽然分模块阅读会容易一些,但对于memcached来说还是有点难度。因为memcached模块之间的关联比较大,不像libevent分得那么开。关联一般是通过一些全局变量。但memcached使用了很多很多很多全局变量,所以阅读代码的时候要注意全局变量是否有static修饰符(如果有的话就心里暗喜吧)。另外,在阅读某一个模块的时候,要假设这些全局变量取默认值并且不会变,这样阅读起来会容易一点。相当部分的全局变量是结构体变量settings的成员变量。全局变量settings的很多成员都可以在启动memcached的时候通过参数设置,但阅读的时候就假定没有设置。全部成员都取默认值。settings_init函数是用来给全局变量settings的各个成员赋默认值的。每次阅读代码的时候建议都打开这个函数方便随时查看各个成员的默认值。

4.memcached使用了大量的锁和多个线程(非worker线程),阅读时不要理会这些锁和线程。看到锁就跳过,假定没有锁是线程安全的。对于那些非worker线程,就假定没有这个线程。哈哈!

5.有一些功能是要开启才有的,比如LRU爬虫功能。在阅读代码的时候就假设没有开启这个功能。这个功能一般是通过全局变量的值而决定开启还是不开启的。那么在看到这个全局变量时,就直接把其取为不开启的值。

至于代码的阅读顺序,可以参考本系列博文的写作顺序。简单来说就是从简单到复杂、从单一的结构到总体。

参考:

http://blog.csdn.net/unix21/article/details/15501049

时间: 2024-08-06 09:52:35

memcached源码分析-----安装、调试以及如何阅读memcached源码的相关文章

nginx源码分析--GDB调试

利用gdb[i]调试nginx[ii]和利用gdb调试其它程序没有两样,不过nginx可以是daemon程序,也可以以多进程运行,因此利用gdb调试和平常会有些许不一样.当然,我们可以选择将nginx设置为非daemon模式并以单进程运行,而这需做如下设置即可: daemon off; master_process off; 这是第一种情况: 这种设置下的nginx在gdb下调试很普通,过程可以[iii]是这样: 执行命令: [email protected]:/usr/local/nginx/

cocos2d-x 源码分析 : EventDispatcher、EventListener、Event 源码分析 (新触摸机制,新的NotificationCenter机制)

源码版本来自3.x,转载请注明 cocos2d-x 源码分析总目录 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结构 1.1 结构 不详吐槽太多,也不贴图了,贴图要审核好久好久好久好久. 从小到大,先来看下Event的结构. 1.Event--------EventTouch,EventCustom,EventMouse,EventKeyboard,EventFocus,EventAcceleration 其中,Eve

sql 注入神器sqlmap 源码分析之调试sqlmap

相信大家平时 用sqlmap 命令,比如 python sqlmap.py -u"https://team.oschina.net/action/team/create" --data="name=onlyGuest&ident=onlyGuest&sident=onlyGuest&temp=1431349990862" --dbs --dbms=mysql --cookie="JmHE4Nja6ZqH8Vw0cSxY%2FW4LT

webpack源码分析——配置调试环境

无论是阅读webpack源码,还是编写webpack的plugin和loader,配置调试环境都是很有必要的.weabpack的运行环境是nodejs,调试webpack就是调试nodejs程序.我们平时使用的IDE如eclipse.webstorm都支持nodejs的调试.本文以eclipse(Version: Oxygen.1a Release (4.7.1a))为例,进行讲解. 在这个例子里面,我们使用webpack <entry> [<entry>] <output&

使用源码包安装,我们该怎么寻找源码包?

因为yum安装太固定,太死板而且有时候下载的包版本很低,在生产环境我们都是用源码包安装.然后找源码包都是上百度搜,但是有时候可能会遇到一些问题,就是有些包搜不出来,而且有时候也怕搜到的网站可能不安全. 我们需要一种安全下载并能找到想找到的的方式 虽然我们不用yum安装,但是可以使用yum找到指定包的下载网站,想不到吧!? yum info sysstat 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base:

4 weekend110的hdfs下载数据源码跟踪铺垫 + hdfs下载数据源码分析-getFileSystem(值得反复推敲和打断点源码)

Hdfs下载数据源码分析 在这里,我是接着之前的,贴下代码 package cn.itcast.hadoop.hdfs; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.commons.io.IOUti

DroidPlugin源码分析安装和卸载

插件其实是Apk安装包,如果要使用必须先要安装和解析,以便知道插件Apk的相关信息.而从Demo中我们知道插件的安装和卸载是通过调用PluginManager的installPackage()和deletePackage()来实现的.就先从PluginManager.installPackage()开始分析插件Apk的安装过程. 第一步:PluginManager. getInstance().installPackage(apkPath,flag); 此函数中只是调用了mPluginManag

vscode源码分析【一】环境搭建+以源码运行vscode

安装git,nodejs和yarn 安装Python27,3.x版本的不行,确保它在你的环境变量里: 安装gulp npm install --global gulp-cli 安装windows build tools: npm install --global windows-build-tools --vs2015 安装node-gyp npm install -g node-gyp 下载vscode的源码: 用管理员的方式打开powershell,不是管理员身份不行 在源码根目录下执行:y

React Native Android入门实战及深入源码分析系列(2)——React Native源码编译

本文为老曾原创,转载需注明出处:http://blog.csdn.net/minimicall?viewmode=contents 在上一节中,我们通过一个相册的制作来学习了React Native编写.这一节我们需要开始学习React Native的源码. 学习源码,从编译源码开始. 首先,我们需要把代码从github中克隆下来. https://github.com/facebook/react-native.git 然后,我们可以切换到它的稳定分支,2016-03-30是我的操作时间,这个