设为首页 收藏本站
查看: 1073|回复: 0

[经验分享] redis源码初探

[复制链接]

尚未签到

发表于 2016-12-18 07:53:42 | 显示全部楼层 |阅读模式
我是一名软件工程师,6年开发经验。之前主要做项目,今年进入互联网企业,意识到技术的重要性。截止到目前,主要使用语言为Java,最近一时兴起,打算读一下开源软件来开阔一下自己的视野,顺便还能提高自己的技术水平。为什么选择读redis?主要有以下几点:
1redis是一个简单的工程,主要是实现键值对的操作(打算读完redis,接着读memcached)
2redis的代码比较少(这个是之前道听途说),读起来应该比较容易。
3redis是单线程的,不涉及比较复杂的并发操作。
 
所以决定以redis作为读开源软件的开始。
但问题马上就来了,我c语言从毕业到现在,都6年了,从来没有再用过,而redis是用c语言写的。困难是相当的大啊。但我相信,各语言是相通的,凭借Java的扎实基础,应该也不会太费劲。
但是,理想很丰满,现实很骨感。下载下来redis的源码(2.8.4),一开傻眼了。这哪里是1万行,80多个文件,看的眼花缭乱。没有统计,估计怎么也上万了吧(后来统计了一下,大概5万行),这可怎么办呢?应该从哪个文件开始读呢?
Redis2.8.4

DSC0000.jpg
 
在这里再跟大家说明一下,我对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语言,首先我想找一个类似eclipseIDE,在网上搜了很多,最终还是觉得eclipse比较靠谱。于是下载了eclipsec/c++版。另外,为了解决在windowredis的包含错误,安装了cygwin软件。但最终,还是不能完全消除redis的编译错误。但已经不影响查看代码,反正我也不在window下面编译代码。
 
跟着《linux c编程一站式学习》走了一遍,回头来看redis源码还是很费劲。后来又一想,学习应该循序渐进,其实redis肯定也是循序渐进的,它也有beta版。那个版本的代码有多少呢?到redis官网找,最终从google上面找的了它的第一版(连接在这里),下载下来一卡,我噻,真是干净极了。头文件加实现,一共13个文件。

DSC0001.jpg
 
我想,这13个文件,一定是最核心的几个文件,再对比一下2.8.4,这些文件几乎都存在,因此,我还是先读读beta版,这样,我更容易看清redis的核心内容。
因此,在这个版本的基础上,结合网上的一些资料,我学习到了redis的一些核心数据结构字符串sds,字典(哈希表)dict,双端列表adlist和事件驱动模型ae 其中adlistaea,都是冠词a。表是一个双端列表(A generic doubly linked list)和(A simple event-driven programming library)。
读这些源码的时候,有很多概念也借鉴了别人的一些理解,如果单从源码读,因为里面有很多的系统函数,不是很明白他的意思,理解起来比较慢。
 
 
熟悉了这些基础的概念之后,我想深入探索一下,redis是如何由客户端的命令路由至一个具体的函数的呢?redis是如何控制知道客户端的数据有没有发送完了呢?因为我对网络编程还不太熟悉,特别是网络通信方面。如果想定制redis,增加均衡负载,怎么进行改造呢?这些都是我下一步探索有待研究的。
 
 
对这类话题感兴趣?欢迎发送邮件至donlianli@126.com
关于我:邯郸人,软件工程师
  请支持原创:http://donlianli.iyunv.com/blog/2008720
献美女一枚。

DSC0002.jpg
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315713-1-1.html 上篇帖子: 深入Redis,读redis-from-the-ground-up有感(转) 下篇帖子: 配置多个redis
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表