上海市交通建设工程安全质量监督站网站,seo网站建设哪家专业,营销型网站设计建设公司,太原最新消息在之前我们介绍了#xff0c;Redis有五种基础数据类型#xff0c;分别是String,Set,List,Hash与SortSet。今天我们又学习了一个命令#xff0c;我们可以使用DEBUG OBJECT key查询Redis中#xff0c;存储数据的一些关键信息#xff0c;如下所示#xff1a;我们发现了zipli…在之前我们介绍了Redis有五种基础数据类型分别是String,Set,List,Hash与SortSet。今天我们又学习了一个命令我们可以使用DEBUG OBJECT key查询Redis中存储数据的一些关键信息如下所示我们发现了ziplist跟intset这两种不在上述基础类型的数据结构这又是什么呢Redis为了节省内存空间当Hash与Zset元素个数较少的时候会使用ziplist进行存储也就是压缩表。在压缩表中元素紧密排列更加节省内存。今天我们一起来探讨ziplist的内部看一看ziplist的实现。数据结构Zlist是有上述元素构成zlbytes 记录着整一个压缩表的长度zltail 记录着最后一个元素的偏移量这是为了倒序遍历整个zlistzlen 用来记录压缩表中节点的数量entryX 列表中的节点节点用来存储具体的数据厂部补丁。zlend 一个特殊值0XFF用来标记压缩列表已经结束了。我们注意到在Redis中数据结构压缩表是紧凑排列的所以我们每次查询都需要遍历整一个列表才能查询到相关数据因为ziplist存放的个数非常有限所以性能的开销并不大。接下来我们来看一看Redis的压缩表中节点的构成。prevlen 用来记录上一个节点的长度因为压缩表可能需要倒序遍历所以需要记录prevlen才能够定位出上一个entry的位置。encoding 在Redis的压缩表中设计精髓都在这里为了节省压缩表占用的内存Redis对Encoding进行了极致的设计。一般都是读取前8个字节用来判断存储的数据是什么。举个简单的例子如果前8个字节是00xxxxxx这里的00开头表示的是这是个非常短的字符串后面的6个x表示字符串的长度2^6-1等于63所以这个数据就encoding就表示content是一个非常短的字符串长度最多为63位。另一个例子如果前8个字节是11111110那么这个表示是int8后面跟一个字节用来表示整数。content 用来存放具体的数据前面已经提到了是用来存放具体的数据。根据上述规则假如我们存放的数据是hello world那么Redis用来保存这个数据Entry如下所示prevlen用来保存上一个Entry的长度跟本数据无关因为是小字符串所以encoding为00001011,1011表示长度为11content则为长度为11的字符串helloworld。最后我们再来了解下连锁更新如同数据结构中数组插入元素时间复杂度为O(N)一样在Redis的数据结构压缩表中插入数据也会一样并且插入数据还可能会引起连锁更新因为每个Entry都会记录上一个Entry的长度所以在插入一定数量的Entry之后Redis就会使用其他数据结构进行数据的存储。好了有关Redis压缩表我们就介绍到这里。欢迎大家关注我近期还准备了一些AI相关的知识整理后会和大家继续分享。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)