数据结构 |Redis中数据类型对应的数据结构

Redis 是一种键值(Key-Value)数据库。相对于关系型数据库(比如 MySQL),Redis 也被叫作非关系型数据库

像 MySQL 这样的关系型数据库,表的结构比较复杂,会包含很多字段,可以通过 SQL 语句,来实现非常复杂的查询需求。而 Redis 中只包含“键”和“值”两部分,只能通过“键”来查询“值”。正是因为这样简单的存储结构,也让 Redis 的读写效率非常高。

Redis 主要是作为内存数据库来使用,也就是说,数据是存储在内存中的。尽管它经常被用作内存数据库,但是,它也支持将数据存储在硬盘中。

Redis 中,键的数据类型是字符串,值的数据类型有很多,常用的数据类型有字符串、列表、字典、集合、有序集合。

1. 字符串(string)

“字符串(string)”这种数据类型非常简单,对应到数据结构里,就是字符串

2. 列表(list)

列表这种数据类型支持存储一组数据。这种数据类型对应两种实现方法,一种是压缩列表(ziplist),另一种是双向循环链表

① 当列表中存储的数据量比较小的时候,列表就可以采用压缩列表的方式实现。具体需要同时满足下面两个条件:

列表中保存的单个数据(有可能是字符串类型的)小于 64 字节;

列表中数据个数少于 512 个。

关于压缩列表,它并不是基础数据结构,而是 Redis 自己设计的一种数据存储结构。它有点儿类似数组,通过一片连续的内存空间,来存储数据。不过,它跟数组不同的一点是,它允许存储的数据大小不同。具

体的存储结构也非常简单。

数据结构 |Redis中数据类型对应的数据结构

压缩列表中的“压缩”两个字该如何理解 ?

听到“压缩”两个字,直观的反应就是节省内存。之所以说这种存储结构节省内存,是相较于数组的存储思路而言的。数组要求每个元素的大小相同,如果要存储不同长度的字符串,那就需要

用最大长度的字符串大小作为元素的大小(假设是 20 个字节)。当存储小于 20 个字节长度的字符串的时候,便会浪费部分存储空间。

数据结构 |Redis中数据类型对应的数据结构

压缩列表这种存储结构,一方面比较节省内存,另一方面可以支持不同类型数据的存储。而且,因为数据存储在一片连续的内存空间,通过键来获取值为列表类型的数据,读取的效率也非常高。

② 当列表中存储的数据量比较大的时候,也就是不能同时满足刚刚讲的两个条件的时候,列表就要通过双向循环链表来实现了。

双向循环链表这种数据结构了见之前。这里着重看一下 Redis 中双向链表的编码实现方式。 

Redis 的这种双向链表的实现方式,非常值得借鉴。它额外定义一个 list 结构体,来组织链表的首、尾指针,还有长度等信息。这样,在使用的时候就会非常方便。

// 以下是 C 语言代码,因为 Redis 是用 C 语言实现的。 typedef struct listnode { struct listNode *prev; struct listNode *next; void *value; } listNode; typedef struct list { listNode *head; listNode *tail; unsigned long len; // .... 省略其他定义 } list;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxfzx.html