目录
SDS 的设计到底有多牛逼Redis 使用 C 语言编写,但是并没有直接使用 C 语言自带的字符串,而是使用了 SDS 来管理字符串。接下来就来探讨下为什么 Redis 使用了 SDS 来管理字符串。 SDS 全称 Simple Dynamic String,即简单动态字符串。SDS 组成部分如下:
SDS 的优势
List 的实现原理在 Redis3.2 之前,List 底层采用了 ZipList 和 LinkedList 实现的,在 3.2 之后,List 底层采用了 QuickList。 Redis3.2 之前,初始化的 List 使用的 ZipList,List 满足以下两个条件时则一直使用 ZipList 作为底层实现,当以下两个条件任一一个不满足时,则会被转换成 LinkedList。
ZipList方式 的实现原理ZipList 是由一块连续的存储空间组成,从图中可以看出 ZipList 没有前后指针。 各部分作用说明:
ZipList 的优缺点比较
LinkedList方式 的实现原理LinkedList 都比较熟悉了,是由一系列不连续的内存块通过指针连接起来的双向链表。 各部分作用说明:
QuickList方式 的实现原理在 Redis3.2 版本之后,Redis 集合采用了 QuickList 作为 List 的底层实现,QuickList 其实就是结合了 ZipList 和 LinkedList 的优点设计出来的。 各部分作用说明:
Set 的实现原理Set 集合采用了整数集合和字典两种方式来实现的,当满足如下两个条件的时候,采用整数集合实现;一旦有一个条件不满足时则采用字典来实现。
整数集合实现原理图 字段实现原理图 Zset 的实现原理Zset 底层同样采用了两种方式来实现,分别是 ZipList 和 SkipList。当同时满足以下两个条件时,采用 ZipList 实现;反之采用 SkipList 实现。
采用 ZipList 的实现原理和 List 的底层实现有些相似,对于 Zset 不同的是,其存储是以键值对的方式依次排列,键存储的是实际 value,值存储的是 value 对应的分值。 采用 SkipList 的实现原理SkipList 分为两部分,dict 部分是由字典实现,Zset 部分使用跳跃表实现,从图中可以看出,dict 和跳跃表都存储的数据,实际上 dict 和跳跃表最终使用指针都指向了同一份数据,即数据是被两部分共享的,为了方便表达将同一份数据展示在两个地方。 关于跳跃表和字典的具体实现,此处不详细介绍,想深入了解的朋友自行上网查阅。 Hash 的实现原理。Hash 底层实现采用了 ZipList 和 HashTable 两种实现方式,相信看到这里大家都比较轻车熟路了,下面来看看。Hash 结构当同时满足如下两个条件时底层采用了 ZipList 实现,一旦有一个条件不满足时,就会被转码为 HashTable 进行存储。
ZipList方式 的实现原理从图上看是不是很熟悉,其实和 Zset 的 ZipList 的实现逻辑几乎相同,就不多介绍了。 HashTable方式 的实现原理HashTable 实现底层采用了字段的方式实现,其中键存储的内容为 field,值存储的是 value 值。 总结本文主要介绍了 5 种基础常用集合的底层实现原理,相信大家看完之后,在业务开发时对集合选用,同时结合业务使用的命令更加有自己的理解。 下篇文章我们来介绍 Redis 数据过期策略、AOF 及 RDB 文件等内容,尽情期待。 |
|