在redis中有五种对象,分别是字符串对象,列表对象,哈希对象,集合对象,有序集合对象。五种对象的具体实现对应六种不同的存储结构,redis支持在不同的数据规模下为每种对象选取不同的存储结构,以达到最好的适应性。下面先介绍六种底层存储结构。
SDS简单动态字符串
redis用来存储字符串的数据结构,可以看作是一个vector维护的字符数组。和C字符串的区别在于存了字符长度,保证不会缓冲溢出(类似vector的resize操作),针对可能的频繁数据修改进行空间预分配,和stl中的string一样是二进制安全的。
预分配策略具体分为两个部分。如果SDS进行修改之后,长度小于1mb,那么将预留一倍的空间,类似vector的分配策略。如果修改后长度大于1mb,那么将预留1mb的空间,减少内存占用。
二进制安全是指可以存储‘\0’字符,因为在使用中SDS不以字符串中的‘\0’作为结尾。
List链表
redis中的链表是无环双向链表,STL中是环形双向链表。包含两个结构体,listNode和list,其中list中存着链表的头结点,尾节点,链表长度。listNode中保存前后指针和对象指针。redis中的链表是多态的,它使用void*指针保存节点值。
hashmap字典
redis中字典用哈希表实现,哈希表的数据结构如下
typedef struct dictht
{
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used