Redis底层剖析——Redis底层的数据结构



一、SDS

SDS(简单动态字符串):Redis会使用SDS表示字符串值,Redis的键值在底层都是用SDS来实现的。
用途:保存数据库中的字符串值外,还可被用作缓冲区,AOF模块中的AOF缓冲区,客户端状态中的输入缓冲区。
在这里插入图片描述
SDS为什么使用空字符串结尾?
可以直接重用一部分C字符串函数库里面的函数

和C语言相比SDS的优势?
1、获取SDS长度的时间复杂度为O(1)
2、SDS可以杜绝缓冲区溢出,当插入值是其会先检查容量是否足够,如果容量不足够会动态修改SDS的空间大小,而且是按需分配扩展至所需的大小,且“/0”不占空间。
3、减少了内存重分配的问题,通过空间预分配和惰性空间释放。
4、是二进制安全的,不仅可以保存文本数据,还可以保存任意格式的二进制数据。
5、兼容部分C字符串函数

在这里插入图片描述

二、链表

在这里插入图片描述

三、字典

在数据库中创建一个键为“msg,值为”hello world“的键值对是,这个键值对就是保存在代表数据库的字典里面的。字典还是哈希键的底层实现之一。
Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就是字典的一个键值对。
在这里插入图片描述

四、跳跃表

通过在每个节点维持多个指向其他节点指针,从而达到快速访问节点的目的
支持平均度O(logN)、最坏O(n)复杂度的节点查找,还可义通过顺序性操作来处理节点。
Redis使用跳跃表作为有序集合键和集群节点中的底层实现之一。
在这里插入图片描述

五、整数集合

集合键底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

整数集合的底层实现为数组,这个数组以有序、无重复的方式保存集合元素,再有需要时,程序会根据新添加的元素类型,改变这个数组的类型。
在这里插入图片描述
升级
每当我们要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合元素的类型都要长时,整数集合需要先进行升级,然后才能将系元素添加到整数集合里面。
升级的好处:
1、提升整数集合的灵活性,可以将int_16t、int_32t、int_64t类型的整数添加到集合中。
2、尽量的节约内存,确保升级操作只会在有需要的时候进行,可以尽量节省内存。

整数集合不支持降级,一旦对数组进行了升级,编码就会一直保持升级后的状态。

六、压缩列表

压缩列表是列表键和哈希键的底层实现之一,当一个列表键只包含少量列表项,并且每个列表项要么就是最小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。

压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存组成的顺序型数据结构,一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值。
在这里插入图片描述
连锁更新
每个节点previous_entry_length属性都记录了前一个节点的长度:
如果前一节点的长度小于254字节,那么previous_entry_ength属性需要用1字节长的空间来保存这个长读值,如果大于254字节,那么previous_entry_length属性需要用5字节的空间来保存这个长度值。
在这里插入图片描述
假设在一个压缩列表中,有多个连续的、长度介于250字节到253字节之间的节点e1-en,当插入新节点时,就会导致e1放不下需要额外扩张空间保存前一个节点的长度值,扩展后这个节点又大于了255字节,下下节点又进行空间重分配操作,造成连锁更新。

在删除时也会发生类似操作
E1-EN是250-253的节点,big节点大于254字节,small包含big大头后小于254字节,当删除small时,从e1开始就会引发连锁更新。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值