以前通过阅读《Redis设计与实现》了解过Redis的源码,之后一直没有对此做过更深入的学习与整理。 随着工作中对Redis的使用越来越多,再加上Redis快速的发展与迭代,又燃起了我重新学习Redis源码的念头。 这一次我想通过写一些总结来对学习的内容做一些整理,以便今后温故知新。

Redis简介

Redis是一个开源、基于内存、可持久化、支持分布式、多种数据类型的key-value数据库。使用ANSI C语言编写,性能卓越,稳定可靠。 可以替代memcached,实现高性能的key-value存储,同时很大程度上弥补了memcached的不足(持久化,多数据类型)。

Redis支持的5种数据类型包括:字符串(Sting)、哈希表(Hash)、列表(List)、集合(Set)、有序集合(SortedSet)。 2.8.9加入的HyperLogLog和3.2加入的GEO的支持也都或多或少使用了这些数据类型。

为什么选择阅读和学习Redis源码

1. Redis被广泛应用于互联网公司
2. Redis应用场景多,可满足很多需求
3. 代码量适中,7万+行代码
4. 出于好奇,想要深入了解Redis的具体实现,从而更好的使用Redis
5. 想通过阅读Redis源码,学习优秀的数据结构与算法

如何阅读和学习Redis源码

我会分为以下六个部分解读Redis源码,从基本数据结构与对象开始,到数据对象是如何保存在数据库中的,以及执行数据操作命令时,如何读写数据。 在对数据库的实现有了完整的学习后,再扩展了解一些Redis实现的比较独立的功能。接下来会介绍一下关于数据安全方面的问题,然后是性能方面的问题。 最后学习Redis多机与集群功能的实现。每个章节都会以先介绍功能,再了解内部实现的方式展开,有些章节会介绍Redis不同版本代码的变化及意义。

第一部分”数据结构与对象”

受到《Redis设计与实现》这本书的影响和启发,从Redis的5种数据类型为引导,引出实现这5种数据类型的对象结构及每个数据类型的底层数据结构。 同时深入了解每个对象的多种数据结构的API,介绍每个对象是如何统一不同数据结构的API。 然后学习不同数据结构的使用场景,以及切换数据结构的条件和切换时数据迁移的过程。 学习了基本的数据结构与对象后,再通过了解Redis不同版本的数据结构与对象的演变,来深入研究这些变化的意义。

第二部分”数据与操作”

先介绍Redis是如何保存键值对的,以及有过期时间的键保存与删除方法。然后介绍Redis是多数据库的具体实现。 了解数据如何保存后,再介绍Redis各种命令的实现,通过对命令的执行到结果的返回,剖析整个过程的实现。

第三部分”独立功能的解读”

了解了数据的存储与操作后,再学习一些Redis实现的独立又实用的功能,例如Pub/Sub(发布/订阅)、Transaction(事务)、HyperLogLog、GEO(地理位置)等

第四部分”数据与安全”

在学习了前三部分Redis的源码后,相信已经可以很好的使用Redis了,但是在使用的过程中数据的安全尤为重要。 这部分将学习Redis是从哪些方面提高数据安全性的。

第五部分”性能与噩梦”

Redis是单线程的,但是却有很高的性能,这部分将介绍Redis是如何实现事件驱动的,以及通过I/O多路复用程序如何既实现了高性能又很好的与其他单线程模块对接。 也正是因为单线程,阻塞就成了Redis的噩梦,介绍如何正确的使用,避免阻塞。

第六部分”多机与集群”

这部分将介绍Redis的多机与集群的实现,分别介绍Replication(主从的复制)、 Sentinel(哨兵)、Cluster(集群)的具体实现,