查漏补缺(二):Redis数据结构实现原理

文章目录

string

string用于进行最简单的key-value存储。redis是使用C语言来实现的,但它并不是直接使用C语言的char数组来实现string。它其实维护了一个叫SDS的结构,这个结构内部封装了一个char数组,还有一个字符串长度值,和一个剩余长度。这样做的优点是:
1.使得计算字符串长度的时间复杂度变为常数级别。因为C语言中计算长度需要遍历整个数组
2.保证二进制安全。在C语言中字符串以“/0”标记结尾,这样就无法储存一些图像信息。使用sds可以按照维护的字符串长度来划分出字符串,而不需要说根据某一个字符来划分。

list

list是基于ziplist(压缩链表)或者quicklist(快速链表)来完成的。
压缩链表可以节省内存,但它原理并不是对数据进行压缩,而是对数据进行编码之后,存储在一个连续的内存地址上,达到节省内存的目的
快速链表,底层其实就是一个双向链表

Hash

是基于dict字典来实现的,字典其实就是一个哈希表,以一个结点数组的方式来实现,因为它是使用链地址法来解决哈希冲突的,所以这个结点就是一个链表结点。里面有key,value属性,还有一个next指针

set

Set也是基于dict字典来实现的,它其实就是利用结点的key值不允许重复这个特点来实现自己不允许存储相同的值这个功能。

zset

排序set。利用了跳表来实现的。
跳表有多层次的结构,其实每层都是一条链表,并且上下链表的对应位置结点会有一个指针进行连接,完成从上到下的一个跳转。
每次进行查询的时候,会从上到下进行遍历。类似于多叉搜索树的思想。就是这样来保证顺序性。

新版本还有了三种新的数据类型:位图,超日志,流

发布了60 篇原创文章 · 获赞 7 · 访问量 3856

猜你喜欢

转载自blog.csdn.net/SCUTJAY/article/details/104921172