前言
时光荏苒,距离我的第一本书《Redis 设计与实现》出版已经过去了整整五年。在这五年间,Redis 从一个不为人熟知、只有少量应用的崭新数据库,逐渐变成了内存数据库领域的事实标准。
五年前,当人们提到 Redis 的时候,语气通常都充满了怀疑:“Redis 我还是第一次听说,它好用吗?” “Redis 比起 Memcached 有什么优势?” “用 Redis 存储数据安全吗,不会丢数据吧?” 然而时至今日,经过大量的实践应用,Redis 简洁高效、安全稳定的特性已经深入人心。无论是国内还是国外,从五百强公司到小型初创公司都在使用 Redis,很多云服务提供商还以 Redis 为基础构建了相应的缓存服务、消息队列服务以及内存存储服务,当你使用这些服务时,实际上就是在使用 Redis。
Redis 除了变得越来越受欢迎之外,另一个变化就是更新速度越来越快,功能也变得越来越多、越来越强大,比如说,Redis 的数据结构数量已经从过去的五种增加到了九种,RDB-AOF 混合持久化模式的引入使得用户不必再陷入 “鱼和熊掌不可兼得” 的难题中,而集群功能和模块机制的引入则让 Redis 在性能和功能上拥有了近乎无限的扩展能力。
综上所述,可以说现在的 Redis 跟五年前比起来已经完全不一样了,而如何向读者讲述新版 Redis 方方面面的变化,则是每一本 Redis 书都必须回答的问题。本书以服务 Redis 初学者和使用者为目标,介绍了 Redis 日常使用中最常用到的部分,并以 “命令描述+代码示例” 的模式详细列举了各个 Redis 命令的用法和用例。我相信无论是刚开始学习 Redis 的读者,还是每天都要使用 Redis 的读者,在阅读本书的时候都会有所收获。
虽然在写作本书的过程中已经思虑再三并且几易其稿,但书中难免还是会有错误或者遗漏的地方。如果读者朋友在阅读的过程中发现任何错误,或有任何疑问、建议,都可以通过邮箱 huangz1990@gmail.com 或者 huangz.me 中列出的联系方式来联系我。由于技术研究和写作工作较为繁重,本人可能无法每封邮件都予以回复,但只要有来信我就一定会阅读,决不食言。
最后,感谢吴怡编辑在写作过程中给我的帮助和指导,感谢赵亮宇编辑为本书出版所做的努力,还要感谢我的家人和朋友,如果没有他们的关怀和支持,本书不可能顺利完成。
Redis 简介
Redis 是一个主要由 Salvatore Sanfilippo(Antirez)开发的开源内存数据结构存储器,经常用作数据库、缓存以及消息代理等。
Redis 因其丰富的数据结构、极快的速度、齐全的功能而为人所知,它是目前内存数据库方面的事实标准,在互联网上有非常广泛的应用,微博、Twitter、GitHub、Stack Overflow、知乎等国内外公司都大量地使用了 Redis。
Redis 之所以广受开发者欢迎,跟它自身拥有强大的功能以及简洁的设计不无关系。
Redis 最重要的特点有以下几种(参见图 1-1):
结构丰富
Redis 为用户提供了字符串、散列、列表、集合、有序集合、HyperLogLog、位图、流、地理坐标等一系列丰富的数据结构,每种数据结构都适用于解决特定的问题。在有需要的时候,用户还可以通过事务、Lua脚本、模块等特性,扩展已有数据结构的功能,甚至从零实现自己专属的数据结构。通过这些数据结构和特性,Redis 能够确保用 户可以使用适合的工具去解决问题。
功能完备
在上述数据结构的基础上,Redis 提供了很多非常实用的附加功能,比如自动过期、流水线、事务、数据持久化等,这些功能能够帮助用户将 Redis 应用在更多不同的场景中,或者为用户带来便利。更重要的是,Redis 不仅可以单机使用,还可以多机使用:通过 Redis 自带的复制、Sentinel 和集群功能,用户可以将自己的数据库扩展至任意大小。无论你运营的是一个小型的个人网站,还是一个为上千万消费者 服务的热门站点,都可以在 Redis 中找到你想要的功能,并将其部署到 你的服务器中。
速度飞快
Redis 是一款内存数据库,它将所有数据存储在内存中。因为计算机访问内存的速度要远远高于访问硬盘的速度,所以与基于硬盘设计的传统数据库相比,Redis 在数据的存取速度方面具有天然的优势。但 Redis 并没有因此放弃在效率方面的追求,相反,Redis 的开发者在实现各项数据结构和特性的时候都经过了大量考量,在底层选用了很多非常高效的数据结构和算法,以此来确保每个操作都可以在尽可能短的时间内完成,并且尽可能地节省内存。
用户友好
“虽然 Redis 提供了很多很棒的数据结构和特性,但如果它们使用起来非常困难的话,那么这一切就没有意义。” 如果你对此有所担心的话,那么现在可以打消你的顾虑了!Redis API 遵循的是 UNIX “一次只做一件事,并把它做好” 的设计哲学。Redis 的 API 虽然丰富,但它们大部分都非常简短,并且只需接受几个参数就可以完成用户指定的操作。更棒的是,Redis 在官方网站(redis.io)上为每个 API 以及相关特性都提供了详尽的文档,并且客户端本身也可以在线查询这些文档。当你遇到文档无法解决的问题时,还可以在 Redis 项目的 GitHub 页面(github.com/antirez/redis)、Google Group(groups.google.com/forum/#!forum/redis-db)甚至作者的 Twitter(twitter.com/antirez)上提问。
内容编排
本书第 1 章为引言,接下来的第 2~20 章正文分成了 “数据结构与应用”、“附加功能” 和 “多机功能” 三个部分。
在 “数据结构与应用” 部分,介绍了 Redis 核心的 9 种数据结构,列举了操作这些数据结构的众多命令及其详细信息,并在其中穿插介绍了多个使用 Redis 命令构建应用程序的示例。通过这些示例,读者可以进一步加深对命令的认识,并学会如何在实际中使用这些命令,达到学以致用的目的。
“附加功能” 部分介绍了 Redis 在数据结构的基础上为用户提供的额外功能,包括管理数据结构的数据库管理功能和自动过期功能,将数据结构持久化至硬盘从而避免数据丢失的持久化功能,提高多条命令执行效率的流水线功能,保证命令安全性的事务和 Lua 脚本功能,以及扩展服务器特性的模块功能等。这些功能在为用户提供方便的同时,也 进一步扩大了 Redis 的适用范围,读者可以通过阅读这一部分来学会如何将 Redis 应用在更多场景中。
“多机功能” 部分介绍了 Redis 的 3 项多机功能,分别是复制、Sentinel 和集群。其中复制用于创建多个 Redis 服务器的副本,并借此提升整个 Redis 系统的读性能以及容灾能力。Sentinel 在复制的基础上,为 Redis 系统提供了自动的故障转移功能,从而使整个系统可以更健壮地运行。最后,通过使用 Redis 集群,用户可以在线扩展 Redis 系统的读写能力。读者可以通过阅读这一部分来获得扩展 Redis 读写性能的相关知识,并根据自己的情况为 Redis 系统选择合适的扩展方式。