
前 言
作为数据库领域的后起之秀,Redis如今已经成为Web开发社区中最火热的数据库之一。随着Web 2.0的蓬勃发展,网站数据快速增长,对高性能读写的需求也越来越多,再加上半结构化数据的比重逐渐增大,人们对早已被铺天盖地地运用着的关系数据库能否适应现今的存储需求产生了疑问,而Redis的迅猛发展为这个领域注入了全新的思维。
Redis凭借其全面的功能受到越来越多的公司的青睐,从初创企业到拥有几百台Redis服务器的大公司,都能看到Redis的身影。Redis也是一个名副其实的多面手,无论是存储、队列还是缓存系统,都有它的用武之地。
本书将从Redis的历史讲起,结合基础与实践,带领读者一步步进入Redis的世界。
第3版说明
距离本书第2版出版已经过去了6年,Redis在这期间也发生了巨大的改变。从3.0版到6.0版,Redis的每个重大版本都给日益壮大的开发者群体带来更多激动人心的新功能。从能更好地胜任消息中间件的流类型,到大大丰富Redis使用场景的模块系统,整个Redis的发展过程就是Redis的开发者与用户良好互动的最佳印证。
截至2021年,在Stack Overflow发布的全球开发者调查报告中,Redis连续4年蝉联“最受开发者喜爱的数据库”以及“亚马逊云使用最广泛的数据库”两项殊荣。借此时机,本书第3版对这几年中Redis推出的重要功能以及社区生态的变化进行相应更新,希望能将这些新的信息与广大读者分享。
目标读者
本书假定读者是Redis新手,甚至可能连Redis是什么都没听说过。本书将详细介绍Redis是什么以及为什么要使用Redis,旨在让读者从零开始,逐步晋级为一个优秀的Redis开发者。
本书还包含很多Redis实践方面的知识,有经验的Redis开发者完全可以直接跳过已经掌握的内容,只阅读感兴趣的部分。每章的引言都简要介绍了这一章要讲解的内容,供读者参考。
本书不需要读者掌握任何Redis的背景知识,不过如果读者有Web后端开发经验或Linux操作系统使用经验,阅读本书将会更加得心应手。
组织结构
第1章介绍了Redis的历史与特性,主要回答初学者最关心的两个问题,即Redis是什么和为什么要使用Redis。
第2章介绍了如何安装和运行Redis。如果你身旁的计算机没有运行Redis,那么一定不要错过这一章,因为本书后面的部分都希望读者能一边阅读一边实践,以提高学习效率。这一章还会介绍Redis命令行客户端的使用方法等基础知识,这些都是实践前需要掌握的知识。
第3章介绍了Redis的数据类型。这一章讲解的不仅是每个数据类型和命令格式,还会着重讲解每个数据类型在实践中如何使用。这一章会带领读者从零开始,一步步地使用Redis构建一个博客系统。读者在学习完这一章的内容之后可以直接在自己的项目中上手实践Redis。
第4章介绍了一些Redis的进阶知识,例如事务和消息通知等。同样这一章还会继续以博客系统为例,以实践驱动学习。
第5章介绍了如何在各种编程语言中使用Redis,这些语言包括PHP、Ruby、Python和Node.js。其中,讲解每种编程语言时,都会用一个有趣的例子进行演示,即使读者不了解某些编程语言,阅读这些例子也能让你收获颇丰。
第6章介绍了Redis脚本的强大功能。这一章会向读者讲解如何借助脚本扩展Redis,并且会对脚本中一些需要注意的知识(如沙盒、随机结果等)进行着重介绍。
第7章介绍了Redis持久化的知识。Redis持久化包含RDB和AOF两种方式,对持久化的支持是Redis可以用作数据库的必要条件。
第8章介绍了多个Redis实例的维护方法,包括使用复制实现读写分离、借助哨兵来自动完成故障恢复以及通过集群来实现数据分片。
第9章介绍了Redis安全和通信协议相关的内容,并推荐了几个第三方的Redis管理工具。
附录A收录了Redis命令的不同属性以及这些属性的特征。
附录B收录了Redis部分配置参数的章节索引。
附录C收录了Redis使用的CRC16实现代码。
排版约定
本书排版使用字体遵从以下约定。
● 等宽字:表示在命令行中输入的命令以及返回结果、程序代码、Redis的命令(包括命令语句和命令定义)。
● 等宽斜体字(或夹在其中的中文楷体字):表示命令或程序代码中由用户自行替换的参数或变量。
● 等宽粗体字:表示命令行中用户的输入内容、伪代码中的Redis命令。
● 命令行的输入和输出以如下格式显示:
$ redis-cli PING PONG
Redis命令行客户端的输入和输出以如下格式显示:
redis> SET foo bar OK
程序代码以如下格式显示:
var redis = require("redis"); var client = redis.createClient(); // 将两个对象JSON序列化后存入数据库中 client.mset( 'user:1', JSON.stringify(bob), 'user:2', JSON.stringify(jeff) );
代码约定
本书的部分章节采用伪代码讲解,这种伪代码类似于Ruby和PHP代码,例如:
def hsetnx($key, $field, $value) $isExists = HEXISTS $key, $field if $isExists is 0 HSET $key, $field, $value return 1 else return 0
其中,变量使用$符号标识,Redis命令使用粗体表示并省略括号,以便于阅读。在命令调用和print等语句中,没有$符号的字符串会被当作字符串字面值。
附加文件
本书第5章中每一节都包含一个完整的程序,读者最好自己输入这些代码来加深理解,当然,先查看程序的运行结果再开始学习也不失为一个好办法。
这些程序代码都存放在GitHub上(https://github.com/luin/redis-book-v3-code),供读者查看和下载。读者也可以从异步社区(https://www.epubit.com)本书页面下载程序代码。
致谢
在写作本书的过程中,我得到了很多朋友的帮助。请允许我在这里占用少许篇幅,向他们致以诚挚的谢意。
感谢人民邮电出版社的杨海玲编辑对本书的支持,没有她的悉心指导,本书就无法顺利完成。
感谢刘亚晨、李欣越、寇祖阳和余尧,他们帮我承担了许多额外的工作,使得我可以全身心地投入写作。
感谢所有浏览本书初稿并提出意见和建议的人:张沈鹏、陈硕实、刘其帅、扈煊、李其超、朱冲宇、王诗吟、黄山月、刘昕、韩重远、李申申、杨海朝、田琪等,感谢你们的支持。
另外,还要感谢“宋老师”,是的,就是书中的主人公之一。几年前我刚创业时,办公场所是和某教育机构合租的。宋老师是该机构的一名老师,同时他也是国内一个知名嘻哈乐团的成员。他平日风趣的谈吐给我们带来了很多欢乐,伴随我们度过了艰苦的创业初期。而我接触Redis,也正是从这段时间开始的。