我将直接根据github上的unstable分支代码分析。主要是2018年7月版本(dict实现的大部分)的和2020年8月版本(其他部分)的,所以可能会有细微差别。因为Redis的代码比较好读,并且质量很高。这里还推荐《Redis设计与实现》一书,它介绍了Redis中部分比较有趣的设计思路,可惜还有些没有覆盖到,本文中对这些有趣的设计也进行了论述。
Redis中主要包含了字符串STRING、列表LIST(双向链表)、集合SET、哈希表HASH、有序集合ZSET五种最常见的类型。在后续的版本中,还提供了bitmap、geohash、hyperloglog、stream这四种类型。
这些对象依赖于一些内部结构,包括字符串(SDS)、哈希表(dict)、链表(list)、跳表(zskiplist)、压缩双向表(ziplist)、快表等。注意出于性能原因,一个对象的实现往往根据具体的内容而选择不同的实现。列举如下:
- STRING
使用int、sds(raw)或者embstr。
下面的类型也是使用STRING的存储的:- hyperloglog
- bitmap
- HASH
使用dict或者ziplist方案。 - LIST
3.0是使用list或者ziplist的方案。
目前使用快表。 - SET
使用dict或者intset的方案。 - ZSET
视数据规模选用ziplist和skiplist+dict的方案。
下面的类型也是使用ZSET的存储的:- GEOHASH
本文中不介绍的是,它们在系列的其他文章中讲解:
- Redis基础设施
- Redis Sentinel
- Redis Cluster
- Redis AOF/RDB
最后,本文的主体部分已经完成,但后续仍然会进行修订,或者补充。