redis数据结构

SDS动态字符串

SDS数据结构

在这里插入图片描述
分别记录了free未使用内存,总长度,和数组,数组就是c语言的字符数组,最后依然为\0结尾,但其实并没有什么用,因为有记录长度,可以根据长度进行读取数据
在这里插入图片描述

SDS的优势

1.获取数组长度常数时间复杂度

c语言数组,依赖结尾\0判断长度,每次获取长度都需要遍历数组。
而sds本身属性就记录了长度,直接取出就行了

2.防止缓冲区溢出

在使用C语言concat函数时 ,需要程序员自己保证内存空间是足够,否则就会溢出
在这里插入图片描述

在这里插入图片描述

sds的api,可以保证拼接前,将buf数组扩容,因此可以保证不会内存溢出

3 减少的内存重分配次数

在这里插入图片描述

sds有两种优化策略
1.空间预分配
在这里插入图片描述

2.惰性空间释放
在这里插入图片描述

在这里插入图片描述

4 二进制安全

我们知道c语言数组存储结构
在这里插入图片描述

是没有记录长度的,而是依靠结束符判断数组边界
但是我们知道redis需要做到二进制安全,也就是存进去什么数据,就要保证取出什么数据,那么如果我们存的字符其中就包括 \0 等特殊字符,例如 a,b,\0,c,那么读出的数据就变成了a,b显然不能满足二进制安全

5 兼容部分C字符串函数

在这里插入图片描述

总结

在这里插入图片描述

链表

数据结构

在这里插入图片描述

在这里插入图片描述

字典

在这里插入图片描述

字典实现

在这里插入图片描述

hash表

在这里插入图片描述

hash表节点

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

hash冲突

在这里插入图片描述

在不断加入新数据的过程中,为了减小hash表的负载因子,程序会通过rehash操作对hash表的大小进行拓展或伸缩。

rehhashe操作

该操作就用到了字典中的 h【0】 和 h【1】。

负载因子=ht【0】.used / ht【0】.size
当负载因子小于0.1的时候程序会执行收缩操作。

扩展:ht[1] >= ht[0].used*2 的 2^n
收缩 : ht[1] = ht[0].used 的 2^n
rehash操作的时候,rehash动作是分多次,渐进式的完成的。避免了集中式rehash带来的庞大计算量。

** 在进行渐进式rehash操作期间,在字典中添加新值的时候 会保存在h[1]中,h[0]中的键值对只会减少,不会增加。**

跳表

跳表数据结构
这篇文章把跳表讲的十分清晰了。注意跳表的head是不存储对象和分值的

整数集合

在这里插入图片描述

整数集合有序,支持三种长度。且支持长度的升级,插入新元素的时间复杂度为On

压缩列表

同整数集合一样压缩列表也不是基础数据结构,而是 Redis 自己设计的一种数据存储结构。它有点儿类似数组,通过一片连续的内存空间,来存储数据。不过,它跟数组不同的一点是,它允许存储的数据大小不同。

压缩列表

听到“压缩”两个字,直观的反应就是节省内存。之所以说这种存储结构节省内存,是相较于数组的存储思路而言的。我们知道,数组要求每个元素的大小相同,如果我们要存储不同长度的字符串,那我们就需要用最大长度的字符串大小作为元素的大小(假设是20个字节)。存储小于 20 个字节长度的字符串的时候,便会浪费部分存储空间。
在这里插入图片描述

数组的优势占用一片连续的空间可以很好的利用CPU缓存访问数据。如果我们想要保留这种优势,又想节省存储空间我们可以对数组进行压缩。
在这里插入图片描述

但是这样有一个问题,我们在遍历它的时候由于不知道每个元素的大小是多少,因此也就无法计算出下一个节点的具体位置。这个时候我们可以给每个节点增加一个lenght的属性。
在这里插入图片描述

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

redis压缩列表

在这里插入图片描述

注意,字符数组的长度,的几个区间,编码长度为1字节,例如字符长度可以为小于63的任何长度,如果为2字节,字符数组长度边长
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值