首页天道酬勤php自动加载机制原理(redis常用数据结构)

php自动加载机制原理(redis常用数据结构)

admin 12-04 04:24 307次浏览

和整数集一样,压缩列表也不是一种基本的数据结构,而是Redis自己设计的一种数据存储结构。它有点像数组,通过连续的内存空间存储数据。但是,它不同于数组,因为它允许不同大小的存储数据。

首先,压缩列表

听到“压缩”这个词,直观的反应是节省内存。这种存储结构之所以节省内存,是与数组的存储思想相比较的。正如我们所知,数组要求每个元素的大小相同。如果我们想要存储不同长度的字符串,我们需要使用字符串的最大长度作为元素的大小(假设20字节)。当存储长度小于20字节的字符串时,会浪费一些存储空间。

数组的优点是占用连续的空间,可以很好的利用CPU缓存来访问数据。如果我们想保持这一优势并节省存储空间,我们可以压缩阵列。

但这有一个问题。当我们遍历它时,因为我们不知道每个元素的大小,所以无法计算下一个节点的具体位置。此时,我们可以为每个节点添加一个lenght属性。

所以。遍历节点后,我们知道了每个节点的长度(占用内存的大小),就可以很容易地计算出下一个节点在内存中的位置。这个结构就像一个简单的压缩列表。

二、Redis压缩列表

压缩列表(zip1ist)是list和hxdcjl的底层实现之一。

当一个列表只包含几个列表项,并且每个列表项要么是一个小整数值,要么是一个短字符串,那么Redis将使用压缩列表作为列表的底层实现。

当hxdcjl只包含几个键值对,并且每个键值对的键和值要么是小整数值,要么是短字符串时,那么Redis将使用压缩列表作为hxdcjl的底层实现。

2.1 redis压缩列表的组成

Redis为节省内存而开发的压缩列表,是由一系列经过特殊编码的连续内存块组成的顺序数据结。压缩列表可以包含任意数量的条目,每个节点可以保存一个字节数组或一个整数值,如下图所示。

示例:

上图显示了一个压缩列表,总长度为80字节,有3个节点。如果我们有一个指向压缩列表起始地址的指针P,那么表节点的地址就是P 60。

2.2 Redis压缩列表节点的组成

每个压缩列表节点可以保存一个字节数组或一个整数值。字节数组可以是以下三种长度之一。

长度小于或等于63 (2 6-1)字节的字节数组;长度小于或等于16383 (2 14-1)字节的字节数组和长度小于或等于4294967295 (2 32-1)字节的字节数组整数值可以是以下六种长度之一

0到12之间的4位长无符号整数、1字节长有符号整数和3字节长有符号整数int16_t类型整数int32_t类型整数int64_t类型整数

节点的previous_entry_length属性以字节为单位记录压缩列表中前一个节点的长度。

previous_entry_length属性的长度可以是1字节或者5字节。

如果前一节点的长度小于254字节,那么 previous_entry_length属性的长度为1字节,前一节点的长度就保存在这一个字节里面。如果前一节点的长度大于等于254字节,那么 previous_entry_length属性的长度为5字节:其中属性的第一字节会被设置为0xFE(十进制值254),而之后的四个字节则用于保存前一节点的长度.

节点的encoding属性记录了节点的content属性所保存数据的类型以及长度。

一字节、两字节或者五字节长,值的最高位为00、01或者10的是字节数组编码这种编码表示节点的 content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录。一字节长,值的最高位以11开头的是整数编码:这种编码表示节点的content属性保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录。

节点的content属性负责保存节点的值,节点值可以是一个字节数组或者整数,值的类型和长度由节点的encoding属性决定。

编码的最高两位00表示节点保存的是一个字节数组。编码的后六位001011记录了字节数组的长度11。content属性保存着节点的值”hello world”。编码11000000表示节点保存的是一个int16_t类型的整数值;content属性保存着节点的值10086

2.3 常用操作的时间复杂度

操作时间复杂度创建一个新的压缩列表O(1)创建一个包含给定值的新节点,并将这个新节点添加到压缩列表的表头或者表尾平均O(N),最坏O(N^2)(可能发生连锁更新)将包含给定值的新节点插人到给定节点之后平均O(N),最坏O(N^2)(可能发生连锁更新)返回压缩列表给定索引上的节点O(N)在压缩列表中査找并返回包含了给定值的节点因为节点的值可能是一个字节数组,所以检查节点值和给定值是否相同的复杂度为O(N),而查找整个列表的复杂度则为(N^2)返回给定节点的下一个节点O(1)返回给定节点的前一个节点O(1)获取给定节点所保存的值O(1)从压缩列表中删除给定的节点平均O(N),最坏O(N^2)(可能发生连锁更新)删除压缩列表在给定索引上的连续多个平均O(N),最坏O(N^2)(可能发生连锁更新)返回压缩列表目前占用的内存字节数O(1)返回压缩列表目前包含的节点数量点数量小于65535时为O(1),大于65535时为O(N)

本文重点

压缩列表是Redis为节约内存自己设计的一种顺序型数据结构。压缩列表被用作列表键和hxdcjl键的底层实现之一。压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值。添加新节点到压缩列表,或者从压缩列表中删除节点,可能会引发连锁更新操作,但这种操作出现的几率并不高。
【Java 框架学习】自学笔记(更新至 类与对象)外网弹性IP和带宽和GP如何在Clojure中将字符串附加到向量雷士灯具管理系统创建过程
监狱智慧车间(支持ai智慧通信的手机) redis提供数据结构(redis底层数据结构)
相关内容