我是一名软件工程师, 6 年开发经验。之前主要做项目,今年进入互联网企业,意识到技术的重要性。截止到目前,主要使用语言为 Java ,最近一时兴起,打算读一下开源软件来开阔一下自己的视野,顺便还能提高自己的技术水平。为什么选择读 redis 呢 ? 主要有以下几点:
1 、 redis 是一个简单的工程,主要是实现键值对的操作(打算读完 redis ,接着读 memcached)
2 、 redis 的代码比较少(这个是之前道听途说),读起来应该比较容易。
3 、 redis 是单线程的,不涉及比较复杂的并发操作。
所以决定以 redis 作为读开源软件的开始。
但问题马上就来了,我 c 语言从毕业到现在,都 6 年了,从来没有再用过,而 redis 是用 c 语言写的。困难是相当的大啊。但我相信,各语言是相通的,凭借 Java 的扎实基础,应该也不会太费劲。
但是,理想很丰满,现实很骨感。下载下来 redis 的源码( 2.8.4 ),一开傻眼了。这哪里是 1 万行, 80 多个文件,看的眼花缭乱。没有统计,估计怎么也上万了吧(后来统计了一下,大概 5 万行),这可怎么办呢?应该从哪个文件开始读呢?
Redis2.8.4
在这里再跟大家说明一下,我对 redis 的使用也比较少,除了里面的 zscore 命令使用过外,其他的也没有用过。前面已经说过,读代码的目的,主要是熟悉开源软件,想借此进一步提高自己的水平。
里面有个 redis.c ,我估摸着是程序入口,果然,里面有我们可爱的 main 函数。声明如下:
int main ( int argc, char **argv) {
struct timeval tv;
/* We need to initialize our libraries, and the server configuration. */
#ifdef INIT_SETPROCTITLE_REPLACEMENT
spt_init(argc, argv);
#endif
setlocale (LC_COLLATE, "" );
……
可是前几行就把我吓着了。
虽然能猜个大概意思,但是还是决定把 c 语言再好好复习一下。到这儿,在 google 搜索 linux c, 打开第一个,就开始看了。一遍复习 c 语言,一遍读 redis 的源码。
聊到这儿,再多点闲话。想学习 c 语言,首先我想找一个类似 eclipse 的 IDE ,在网上搜了很多,最终还是觉得 eclipse 比较靠谱。于是下载了 eclipse 的 c/c++ 版。另外,为了解决在 windowredis 的包含错误,安装了 cygwin 软件。但最终,还是不能完全消除 redis 的编译错误。但已经不影响查看代码,反正我也不在 window 下面编译代码。
跟着《 linux c 编程一站式学习》走了一遍,回头来看 redis 源码还是很费劲。后来又一想,学习应该循序渐进,其实 redis 肯定也是循序渐进的,它也有 beta 版。那个版本的代码有多少呢?到 redis 官网找,最终从 google 上面找的了它的第一版(连接在 这里 ),下载下来一卡,我噻,真是干净极了。头文件加实现,一共 13 个文件。
我想,这 13 个文件,一定是最核心的几个文件,再对比一下 2.8.4 ,这些文件几乎都存在,因此,我还是先读读 beta 版,这样,我更容易看清 redis 的核心内容。
因此,在这个版本的基础上,结合网上的一些资料,我学习到了 redis 的一些核心数据结构字符串 sds, 字典(哈希表) dict ,双端列表 adlist 和事件驱动模型 ae 。 其中 adlist 和 ae 的 a ,都是冠词 a 。表是一个双端列表 ( A generic doubly linked list) 和( A simple event-driven programming library )。
读这些源码的时候,有很多概念也借鉴了别人的一些理解,如果单从源码读,因为里面有很多的系统函数,不是很明白他的意思,理解起来比较慢。
熟悉了这些基础的概念之后,我想深入探索一下, redis 是如何由客户端的命令路由至一个具体的函数的呢? redis 是如何控制知道客户端的数据有没有发送完了呢?因为我对网络编程还不太熟悉,特别是网络通信方面。如果想定制 redis ,增加均衡负载,怎么进行改造呢?这些都是我下一步探索有待研究的。
对这类话题感兴趣?欢迎发送邮件至 donlianli@126.com
关于我:邯郸人,软件工程师
请支持原创:http://donlianli.iyunv.com/blog/2008720
献美女一枚。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com