底层数据结构

字符串: SDS

list: 元素少且小 👉🏿 ziplist , 元素多且大 👉🏿 双链表

hash: 元素少且小 👉🏿 ziplist , 元素多且大 👉🏿 hashtable

zset: 元素少且小 👉🏿 ziplist , 元素多且大 👉🏿 skiplist

set: 元素少且小 👉🏿 intset , 元素多且大 👉🏿 hashtable

redis的hashtable使用拉链法解决冲突

什么是跳跃表?

跳表是一种带多级索引的链表。

有序链表能以log(n)的时间复杂实现查找,但是空间复杂度是O(n),也就是说,如果将包含 n 个结点的单链表构造成跳表,我们需要额外再用接近 n 个结点的存储空间。

答:跳表这种高效的数据结构,值得每一个程序员掌握

为什么使用压缩ziplist?

答:相较于双链表,节省了两个指针的空间。(pre_entry_length前驱数据项的大小。因为不用描述前驱的数据类型,描述较为简单)。相较于数组,ziplist的每个entry所占的内存大小可以不同,便于节省空间。

为什么list hash zset 在数据量大的时候不再使用ziplist?

答:难以获得大的连续的内存空间。

参考

图解redis五种数据结构底层实现(动图哦)

Redis 数据结构 ziplist

Redis源码分析-压缩列表ziplist

版权

评论