终于读完redis的源码了,颇有感触。
由于楼主用mac,所以适配了clion:
github:https://github.com/524243642/redis-4.0.2-with-cmakelist-for-reading-code-in-clion
由于互联网公司整体工作结构比较快,平时零零散散的抽出一些时间来阅读,所以前后持续了一段时间(2018-08-21-2019-05-22),关键是做爱做的事情才能坚持下去
其中数据结构部分、IO模型部分、以及策略、AOF、RDB,PSYNC部分为精读,其他架构设计部分,redis cluster,redis sentinel部分泛读。
也来谈谈一部分感受吧。
1.redis适用的业务场景比较多,整体偏向于业务架构,单进程模型。核心的内容就是数据结构和IO,当然还有其他一些比较特殊的点,,里边也有嵌套着一部分异步线程(AOF fsync,evict驱逐空间释放,等等)和异步进程RDB,AOF
2.IO复用主要是改写的epoll代码,kqueue的ctl算法有优化,这里不做讨论
3.数据结构部分是精华,可以领略到redis在数据量较小的时候和数据量较大时候的不同处理策略,其中涉及到一部分算法(dict bitreverse),编码,还有空间和时间的平衡等策略,值得阅读,楼主移植过redis skiplist到python,效率很高,很契合业务场景,不得不对作者由衷的敬佩
4.AOF,RDB,这些主要为redis持久化,redis4.0之后有混合持久化
5.psync部分重同步主要是通过一个环形缓冲队列,来进行主从复制,十分高效
6.evict驱逐,这部分主要是redis支持ttl,lru,lfu,可以进行内存驱逐,算法虽然写的比较高效,但是在频繁内存回收的情况下,由于有写入AOF,还是有可能造成阻塞,所以redis的内存一定要保证充足,避免有大量的边界逐出,(感觉redis这一块写的可以更好,可以先逐出<maxmemory,而不是逐出到maxmemory,可能也是为了保证最大程度的数据完整性)
7.整体的架构设计
aeSetBeforeSleepProc(server.el,beforeSleep);
aeSetAfterSleepProc(server.el,afterSleep);
aeMain(server.el);
主要有以上三部分,eventloop处理文件事件,随后处理时间事件,顺序是由aeProcessEvents决定。
8.redis cluster部分,楼主只看了在每个slot上有key计数,没有看gossip协议的交互,还有其实现细节,不过楼主有一些一致性hash和类似redis cluster的非一致性hash的工程经验。redis sentinel部分也没细看。这两部分不做评论,预估redis cluster的选主基本类似raft
我随后会把加过注释的redis源码放到github上,有兴趣的可以随时补充