序
在开源界,高性能服务的典型代表就是Nginx和Redis。纵观这两个软件的源码,都是非常简洁高效的,也都是基于异步网络I/O机制的,所以对于要学习高性能服务的程序员或者爱好者来说,研究这两个网络服务的源码是非常有必要的。
Nginx目前市面上的书籍很多,但是Redis确实寥寥无几。这几年Redis版本发展非常快,从稳定的2.x版本,发展到增加了很多优秀特性的5.0版本,这些特性目前尚无资料进行系统讲解。本书的出版填补了Redis 5.0技术学习方面的重大空缺,是技术同仁深入理解Redis内核实现机制的有效途径。
Redis是一个优秀的高性能分布式缓存服务器:在实际应用场景中,每秒QPS能够达到4.5万~5万,算得上性能“怪兽”;在常规非协程的场景中,Redis基本是C10K高性能服务的经典代表。
除性能优势外,Redis的整体代码结构也非常清晰,包括基础数据结构、数据类型实现、数据库实现、服务端实现、集群/主从/队列等,基本模块分布清晰,代码质量非常高:
static int aeApiCreate(aeEventLoop *eventLoop) { aeApiState *state = zmalloc(sizeof(aeApiState)); if (! state) return -1; state->events = zmalloc(sizeof(struct epoll_event)*eventLoop->setsize); if (! state->events) { zfree(state); return -1; } state->epfd = epoll_create(1024); /* 1024 is just a hint for the kernel */ if (state->epfd == -1) { zfree(state->events); zfree(state); return -1; }
eventLoop->apidata = state; return 0; }
上面是创建epoll队列的简单代码,简单明了,完全符合《Unix编程艺术》提到的各种关于简单明确的要求,代码赏心悦目,不花里胡哨。
除了代码结构之外,Redis的各种类型数据结构也设计良好:简单稳定不容易溢出的字符串结构(sds),快速排序查找的跳跃表(skiplist),节约内存的压缩列表(ziplist),基于Hash表实现的字典(dict),基于链表(list)和压缩列表(ziplist)实现的快速列表(qucklist),基于listpac和基数树(Rax)实现的消息队列(Stream)等,涵盖多种优质数据结构的实现。
另外不得不提的是,各类算法在Redis里也都得到了呈现,比如Hash常用算法times33、物理位置查找算法geohash、高效率的统计算法HyperLogLog,等等。读完Redis 5.0.0的9.2万行源码,大概比上一学期的数据结构课更有价值。Redis可谓数据结构和常规算法的饕餮盛宴。深入研究Redis 5,相信对技术的理解会更深入。
优质的菜品需要有技艺精湛的厨师来烹饪,本书就像以优质菜品做成的“大菜”。整本书没有太多啰唆的语言,直接抽丝剥茧:从基本的数据结构类型,Redis内部每个操作命令的底层代码运行逻辑和结构,一直到整个Redis持久化技术、主从技术、分布式集群技术等,都有深入源码级别的讲解,让你领略从数据结构到整个高性能服务的全部设计之美。
学以致用,读者朋友通过领会与实践来提升技术,成为一个高性能网络服务开发高手,继而深入理解缓存服务,设计自己的高性能缓存服务系统或者缓存数据库系统,应用到自己业务中去,岂非快哉!
在整本书里,我也看到了一群程序员的认真执着,把每个业务数据流程图、关键代码、数据结构图都规划得详细、清晰,把自己对技术的各种理解融入书中。本书脉络清晰,适合刚入行的后端程序员、高性能服务开发者、系统运维人员、技术架构师等阅读。希望阅读本书的技术同仁都能够得到进步和提高。
谢华亮(黑夜路人)
2019年4月