目录
概要
简述Redis底层使用的数据结构,如SDS,字典,跳跃表等。
简单动态字符串
SDS,simple dynamic string,可修改的简单动态字符串,用作Redis默认字符串表示。
与C语言字符串对比的优势
获取字符串长度的复杂大为O(1) | 因为记录了长度 |
API是安全的,不会造成缓冲区溢出 | 因为追加字符串内容时,会检查剩余长度是否满足要求,对于不满足长度要求的情况,则创建一个新字符串,也就新的内存空间,而不是再原内存空间追加。 |
修改字符串长度N次,最多执行N次内存分配 | 可变字符串,预留空间。 |
可保存文本和二进制数据 |
链表
双端无环链表,用于列表、发布与订阅、慢查询、监控器。
结构定义
字典
结构定义
哈希表节点结构
哈希表
字典
哈希表作为底层实现,每个字典有两个哈希表,一个平时使用,一个在rehash时使用。
当字典作为数据库的底层实现或者哈希键的底层实现时,Redis使用MurmerHash2算法计算键的哈希值。MurmerHash算法的优势在于,即使键是有规律的,算法仍然可以给出一个很好的随机分布值,并且计算速度很快。
哈希表使用链地址解决键冲突,被分配到同一个索引上的多个键值对连接成一个单向链表。
对哈希表进行扩展或收缩时,程序将现有哈希表的所有键值对rehash到新的哈希表中,而且是渐进式完成的。
跳跃表
跳跃表是一种有序数据结构,每个节点持有多个指向其他节点的指针,达到快速访问的目的。查找节点平均复杂度O(logN),最坏O(N)。
跳跃表作为有序集合的底层实现之一,如果有序集合中元素数量很多,或者元素的成员是比较长的字符串,Redis就会使用跳跃表作为底层实现。
结构定义
节点结构
表结构
整数集合
整数集合是集合的底层实现之一,适用于集合中只包含整数值,且元素数量不多时。
结构定义
压缩列表
压缩列表是列表和哈希的底层实现之一。当一个列表中包含少量列表项且列表项数据要么是小整数要么是短字符串时,Redis会选用压缩列表作为列表的底层实现。
参考
《Redis设计与实现》