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 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 源码解析之sds小结(4) -> 正文阅读

[大数据]源码解析之sds小结(4)

背景

本次阅读的版本是redis5.0,sds共分为5种数据结构,sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64。

阅读主要的源码文件为sds.hsds.c ,作为redis对字符串封装的结构体,它在内存控制,二进制安全,快速读取,字符串变长方面表现更好。

缺点:占用更多的内存空间,毕竟有头信息的存在。

1.sds基本结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D8jYTyRy-1651841323086)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5cc2673e-80a3-4565-9d6d-9d3850c728e8/sds_字符串基本结果.png)]

从上图可以看出,其基本结构可以大致分为:

头信息部分:

  1. 字符串总长度:alloc
  2. 字符串已使用长度:len
  3. 字符串类型标识:flag
  4. 字符串数组: buff[]

而sds.c中,主要就是对于sds的各种操作,其中包括前面写的sdsnewlen(sds对象构建),sdsMakeRoomFor(sds扩容),sdsRemoveFreeSpace (sds压缩free空间)等基本操作。

通过阅读,发现对sds的操作主要分为下面几个操作:

对len操作
对alloc操作
对sds类型进行变更
对buff[]进行操作

而针对类型变更需要重新申请一片内存,然后通过复制和构造新sds,并释放旧sds。


2.sds的特殊性

虽然sds的结构体是包含4个部分,但是sds的指针并不是指向头部的,而是指向buff[]的。

这个实现其实并不新鲜,在mysql的行结构中,上一条记录指向下一条记录的指针(数据位置)也是真实数据位置,而不是行结构的头部位置。(可以参考一下我的mysql行结构解析里面的内容)

2.1 sds指向buff[]意义是啥呢?

1.跟C语言的字符串结构一致,向下兼容

2.向前拿到sds类型,就知道头的大小,就能计算出sds字符串的实际长度

3.拿到实际长度就能从sds当前指针向后读取实际长度的大小,就是实际字符串。(更快)

这样就不用单纯依据\0来作为字符串结束符来读取字符串了。(二进制安全,\0不会造成截断问题)

3.核心方法

  1. sdsHdrSize 计算sds的头部大小
  2. sdsReqType 根据字符串长度获取sds类型
  3. sdsnewlen 根据初始值和初始长度创建sds
  4. sdsfree(sds s) 释放sds
  5. sdsupdatelen 对第一个\0终止符进行截取
  6. sdsclear 清理buff[] ,并将终止符设置到字符串的第一个位置
  7. sdsMakeRoomFor 字符串扩容一定长度
  8. sdsRemoveFreeSpace 字符串sds压缩,移除free空间,也就是len=alloc
  9. sdsAllocSize sds整个结构所占字节大小
  10. *sdsAllocPtr 获取sds的头部指针

其他的方法就不一一列举了,其实,只要了解sds的结构和操作方式,其他的一些方法理解起来基本没啥问题。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:10:56  更:2022-05-08 08:11:30 
 
开发: 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 0:19:38-

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