IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> redis数据结构 -> 正文阅读

[大数据]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字节,字符数组长度边长
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:08:12  更:2022-03-06 13:08:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:03:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码