Redis篇——Zset在Redis中底层存储数据结构,深入浅出详细剖析底层存储逻辑,一篇文章帮你拿下!

目录

引出Zset存储结构

压缩列表

跳表

压缩列表和跳表优缺点


引出Zset存储结构

先后往Zset集合中添加数据,底层的存储数据结构发生了变化,从压缩列表变成了跳表。为什么会出现这个情况呢?
首先先了解什么是压缩列表

压缩列表

1、定义
压缩列表(ziplist)是Redis为了节省内存而开发的一种特殊数据结构,它由一系列节点组成,每个节点可以保存一个字节数组或整数值。这种数据结构在内存中以连续的方式存储,可以用来存储列表和哈希表等数据类型的底层实现。当哈希表中的元素个数比较少并且每个元素的值占用空间比较小的时候,Redis就会使用压缩列表做为哈希的内部编码。
压缩列表有点类似于数组。数组的特性是查找根据下标很快就能定位数据,但是插入数据很慢,因为插入位置后面的数据都需要挪动位置。

跳表

1、定义
将有序链表改造为支持“折半查找”算法,可以进行快速的插入、删除、查找操作。
解释上面这句话:

一开始跳表的设计只是一排链表。那么链表特性是插入数据很快,但是查询 很慢。查询的底层原理是从小到大根据指针一个一个的查找。

后来升级成有序链表每两个元素中的第一个元素向上再向上提一层,类似于创建了一个冗余的索引层 ,最后会生成一个第一层为1个元素的这样一个结构。
查询逻辑:
会从左上角第一个元素开始向下查找。假设我希望查找32,那么会先确定32在上图的25~100之间,那么向下查找;32在25~50之间;直接就能锁定32的位置。
省略了像之前那样单向有序链表查询数据需要指针依次向右查找。有点类似于“折半查询”。

压缩列表和跳表优缺点

1、压缩列表的优点:
(1)内存空间连续:压缩列表被设计成一种内存紧凑型的数据结构,这样可以更高效地利用内存空间。
(2)数据结构紧凑:压缩列表的元素只占用所需要的内存空间,相比数组,它可以更节省内存。
(3)实现简单:压缩列表的实现比AVL树等其他数据结构要简单。

2、压缩列表的缺点:
(1)查询效率低:如果存储的元素过多,查询效率就会降低,因为查找的方式是遍历新增或修改某个元素时,压缩列表占用的内存空间需要重新分配,甚至可能引发连锁更新的问题。
(2)不适合存储大量数据:由于压缩列表使用连续的内存空间,对于大规模数据的存储和管理可能会存在一些限制。

3、跳表的优点:
(1)有序性:跳表是有序的,这使得它能够快速找到某个范围内的值。
(2)支持对某个范围数据的查找:跳表可以方便地支持对某个范围数据的查找,这是因为它被设计成一种可以快速跳过一些无用的数据元素的结构。
(3)查询速度快:跳表的查询时间复杂度为O(logn),这使得它在处理大量数据时能够提供更快的查询速度。
(4)支持多值查找:与字典不同,跳表可以支持多值查找。

4、跳表的缺点:
(1)需要额外的内存空间:跳表需要额外的内存空间来存储指针和层级信息。
(2)不适合存储大量小值:由于跳表需要存储指针和层级信息,因此对于大量小值的存储可能会存在一些效率上的问题。
(3)不适合用于频繁更新和删除操作:由于跳表需要维持其有序性,因此对于频繁的更新和删除操作可能会带来一些性能上的问题。
 

至此,关于Zset在Redis中底层存储数据结构介绍完毕,后续还会持续更新相关技术点,敬请期待!

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Be explorer

若认可笔者文章,手头富裕望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值