# 加餐(一)| 经典的Redis学习资料有哪些? 你好,我是蒋德钧。 咱们课程的“基础篇”已经结束了。在这个模块,我们学习了Redis的系统架构、数据结构、线程模型、持久化、主从复制和切片集群这些核心知识点,相信你已经初步构建了自己的一套基础知识框架。 不过,如果想要持续提升自己的技术能力,还需要不断丰富自己的知识体系,那么,阅读就是一个很好的方式。所以,这节课,我就给你推荐几本优秀的书籍,以及一些拓展知识面的其他资料,希望能够帮助你全面掌握Redis。 ## 经典书籍 在学习Redis时,最常见的需求有三个方面。 * 日常使用操作:比如常见命令和配置,集群搭建等; * 关键技术原理:比如我们介绍过的IO模型、AOF和RDB机制等; * 在实际使用时的经验教训,比如,Redis响应变慢了怎么办?Redis主从库数据不一致怎么办?等等。 接下来,我就根据这些需求,把参考资料分成工具类、原理类、实战类三种。我们先来看工具类参考资料。 ### 工具书:《Redis使用手册》 一本好的工具书,可以帮助我们快速地了解或查询Redis的日常使用命令和操作方法。我要推荐的《Redis使用手册》,就是一本非常好用的工具书。 在这本书中,作者把Redis的内容分成了三大部分,分别是“数据结构与应用”“附加功能”和“多机功能”。其中,我认为最有用的就是“数据结构与应用”的内容,因为它提供了丰富的操作命令介绍,不仅涵盖了Redis的5大基本数据类型的主要操作命令,还介绍了4种扩展数据类型的命令操作,包括位图、地址坐标、HyperLogLog和流。只要这本书在手边,我们就能很轻松地了解和正确使用Redis的大部分操作命令了。 不过,如果你想要了解最全、最新的Redis命令操作,我建议你把Redis的命令参考网站收录到你的浏览器书签中,随用随查。目前,Redis官方提供的所有命令操作参考肯定是最全、最新的,建议你优先使用这个[官方网站](https://redis.io/commands/)。在这个网页上查找命令操作非常方便,我们既可以通过命令操作的名称直接查找,也可以根据Redis的功能,分类查找对应功能下的操作,例如和集群相关的操作,和发布订阅相关的操作。考虑到有些同学可能想看中文版,我再给你提供一个[翻译版的命令参考](http://redisdoc.com/)。 除了提供Redis的命令操作介绍外,《Redis使用手册》还提供了“附加功能”部分,介绍了Redis数据库的管理操作和过期key的操作,这对我们进行Redis数据库运维(例如迁移数据、清空数据库、淘汰数据等)提供了操作上的指导。 有了工具手册,我们就能很轻松地掌握不同命令操作的输入参数、返回结果和复杂度了。接下来,就是进一步了解各种机制背后的原理了,我再跟你分享一本原理书。 ### 原理书:《Redis设计与实现》 虽然《Redis设计与实现》和《Redis使用手册》是同一个作者写的,但是它们的侧重点不一样,这本书更加关注Redis关键机制的实现原理。 介绍Redis原理的资料有很多,但我认为,这本书讲解得非常透彻,尤其是在Redis底层数据结构、RDB和AOF持久化机制,以及哨兵机制和切片集群的介绍上,非常容易理解,我建议你重点学习下这些部分的内容。 除了文字讲解,这本书还针对一些难点问题,例如数据结构的组成、哨兵实例间的交互过程、切片集群实例的交互过程等,都使用了非常清晰的插图来表示,可以最大程度地降低学习难度。 其实,这本书也是我自己读的第一本Redis参考书,可以说,是它把我领进了Redis原理的大门。当时在学习时,正是因为有了这些插图的帮助,我才能快速地搞懂核心原理。直到今天,我都还记得这本书中的一些插图,真是受益匪浅。 虽然这本书的出版日期比较早(它针对的是Redis 3.0),但是里面讲的很多原理现在依然是适用的,它可以帮助你在从入门Redis到精通的道路上,迈进一大步。 ### 实战书:《Redis开发与运维》 在实战方面,《Redis开发与运维》是一本不错的参考书。 首先,它介绍了Redis的Java和Python客户端,以及Redis用于缓存设计的关键技术和注意事项,这些内容在其他参考书中不太常见,你可以重点学习下。 其次,它围绕客户端、持久化、主从复制、哨兵、切片集群等几个方面,着重介绍了在日常的开发运维过程中遇到的问题和“坑”,都是经验之谈,可以帮助你提前做规避。 另外,这本书还针对Redis阻塞、优化内存使用、处理bigkey这几个经典问题,提供了解决方案,非常值得一读。在阅读的时候,你可以把目录里的问题整理一下,做成列表,这样,在遇到问题的时候,就可以对照着这个列表,快速地找出原因,并且利用书中的方案去解决问题了。 当然,要想真正提升实战能力,光读书是远远不够的,毕竟,“纸上得来终觉浅”。所以,我还想再给你分享两条建议。 第一个建议是阅读源码。读源码其实也是一种实战锻炼,可以帮助你从代码逻辑中彻底理解Redis系统的实际运行机制,**当遇到问题时,可以直接从代码层面进行定位、分析和解决问题**。阅读Redis源码,最直接的材料就是Redis在GitHub上的[源码库](https://github.com/redis/redis)。另外,有一个[网站](https://github.com/huangz1990/redis-3.0-annotated)提供了Redis 3.0源码的部分中文注释,你也可以参考一下。 另外,我们还需要亲自动手实践。在课程的留言中,我看到有同学说“没有服务器无法实践”,其实,Redis运行后本身就是一个进程,我们是可以直接使用自己的电脑进行部署的。只要不是性能测试,在功能测试或者场景模拟上,自己电脑的环境一般都是可以胜任的。比如说,要想部署主从集群或者切片集群,模拟主库故障,我们完全可以在自己电脑上起多个Redis实例来完成,只要保证它们的端口号不同,就可以了。 好了,关于Redis本身的书籍的推荐,就先告一段落了,接下来,我想再给你分享一些扩展内容。 ## 扩展阅读方向 通过前面几节课的学习,我相信你一定已经发现了,Redis的很多关键功能,其实和操作系统底层的实现机制是相关的,比如说,非阻塞的网络框架、RDB生成和AOF重写时涉及到的fork和写时复制机制,等等。另外,Redis主从集群中的哨兵机制,以及切片集群的数据分布还涉及到一些分布式系统的内容。 我用一张图片,展示一下Redis的关键机制和操作系统、分布式系统的对应知识点。 ![](https://static001.geekbang.org/resource/image/a0/2c/a0f558fbf9105817744ee2c44230c62c.jpg) AOF日志的刷盘时机和操作系统的fsync机制、高速页缓存的刷回有关,而网络框架跟epoll有关,RDB生成和AOF重写与fork、写时复制有关(我在前面第3、4、5讲上讲过它们的关联)。 此外,我在[第8讲](https://time.geekbang.org/column/article/275337)介绍的哨兵选主过程,其实是分布式系统中的经典的Raft协议的执行过程,如果你比较了解Raft协议,就能很轻松地掌握哨兵选主的运行机制了。在[第9讲](https://time.geekbang.org/column/article/276545),我们学习了实现切片集群的Redis Cluster方案,其实,业界还有一种实现方案,就是ShardedJedis,而它就用到了分布式系统中经典的一致性哈希机制。 所以,如果说你希望自己的实战能力能够更强,我建议你**读一读操作系统和分布式系统方面的经典教材,**比如《操作系统导论》。尤其是这本书里对进程、线程的定义,对进程API、线程API以及对文件系统fsync操作、缓存和缓冲的介绍,都是和Redis直接相关的;再比如,《大规模分布式存储系统:原理解析与架构实战》中的分布式系统章节,可以让你掌握Redis主从集群、切片集群涉及到的设计规范。了解下操作系统和分布式系统的基础知识,既能帮你厘清容易混淆的概念(例如Redis主线程、子进程),也可以帮助你将一些通用的设计方法(例如一致性哈希)应用到日常的实践中,做到融会贯通,举一反三。 ## 小结 这节课,我给你推荐了三本参考书,分别对应了Redis的命令操作使用、关键机制的实现原理,以及实战经验,还介绍了Redis操作命令快速查询的两个网站,这可是我们日常使用Redis的必备工具,可以提升你使用操作Redis的效率。另外,对于Redis关键机制涉及到的扩展知识点,我从操作系统和分布式系统两个方面进行了补充。 Redis的源码阅读是成为Redis专家的必经之路,你可以阅读一下Redis在GitHub上的源码库,如果觉得有难度,也可以从带有中文注释的源码阅读网站入手。 最后,我也想请你聊一聊,你的Redis学习资料都有哪些呢?欢迎在留言区分享一下,我们一起进步。另外,如果你觉得今天的内容对你有所帮助,也欢迎你分享给你的朋友或同事。