学习Redis不仅要学习各种命令的使用,如果有时间最好阅读以下redis的源码。
先推荐一本书黄建宏的《redis设计与实现》,里面非常清晰的讲述的Redis3.0的源码实现,本博客也是在阅读此书之后的一些总结和感悟。(本博客基于Redis5.0.3)
一.数据结构与对象
用过Redis的中支持的五大数据类型:字符串String、列表List、集合Set、哈希表Hash、有序集合ZSet。
那么他们底层C语言是如何实现的呢?先来介绍一下底层所用到的数据结构,分别是:简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表。
简单动态字符串
简单动态字符串(simple dynamic string),简称SDS。说白了就是在C字符串上封装一层,类似于Java中的String。
链表
list
字典
哈希表
字典有两个哈希表,用来rehash
跳跃表
相比二叉查找树,rebalance成本低,依靠随机
整数集合
压缩列表
zipList是list和hash的底层实现之一。
即当list包含少量的列表项或者小整数。要么就是长度比较短的字符串,则会使用ziplist
当hash键包含少量的少量的键值对,并且这个键值对和值要么就是小整数值,要么就是长度较短的字符串 则会使用ziplist
zipList是为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。
对象
Redis并没有用以上的数据结构来实现数据库,而是基于这些数据结构创建了一个对象系统,包括:字符串对象、列表对象、哈希对象、集合对象、有序集合对象五中类型。
typedef struct redisObject {
unsigned type:4; //类型
unsigned encoding:4; //编码
void *ptr; //指向底层数据结构的指针
...
} robj;
type:记录了对象的类型,可以是一下常量中的一个:
可以用TYPE命令查看
encoding:记录了指针指向对象的底层实现的数据结构。