sds是redis项目封装一个基于字符串操作的库,其官方解释为:"SDSLib 2.0 -- A C dynamic strings library"。

官方下载源码后上传至码云Redis,头文件和源文件连接如下:

sds.h

sds.c

其想法是在保留C语言对字符串操作对同时,还实现了内存管理,节省了使用成本。

实现原理:变长struct。

typedef char *sds;
struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};

总共五个结构,其他四个大同小异,sdshdr5没有len和alloc两个成员,仅做访问flag获取类型用。

其他三个的区别在于len和alloc两个成员的类型不一样,对应的buf成员的存储数据量也不一样,在某些机型下sdshdr32和sdshdr64可能是相同的。

为了操作的统一性,每个struct对应一个唯一的flag存储在flags成员的低三位中。

成员解析:

- len:字符串的长度,不包含'\0','\0'由自己维护,用户不需要关心;

- alloc:申请的内存空间大小;

- flags:类型,当前仅使用低三位,后续可能会有扩展,用于判断当前sds对应的header的类型;

- buf:变长部分,存储数据;

巧妙之处:

1. 为了保证C语言原生对字符串对操作,buf定义为'char *',创建函数返回的是buf成员对应的内存地址,可直接访问操控,只不过使用typedef重命名为sds。

2. buf和flags类型相同,根据地址排列关系,buf[-1]正好是flags对应的内存空间,通过flags得到struct类型,进而推算出buf对应的header。当header获取到时,所有成员可任意访问。

3. sds定义了一系列的操作函数,考虑到print族函数比较重,结合stdarg.h实现了建议版本的print系列。

sds代码的阅读难处有三点:变长strcut、地址转换、define

变长结构:C语言特点,使用方法网上可搜到一大堆;

地址转换:struct的内存布局;

define:sdshdr为数字系列,结合‘##’可拼接出对应的结构名

#define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (void*)((s)-(sizeof(struct sdshdr##T)));
#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))

PS:阅读redis源码,特此记忆,望坚持。

redis源码浅见之sds相关推荐

  1. Redis源码分析(sds)

    源码版本:redis-4.0.1 源码位置:https://github.com/antirez/sds 一.SDS简介 sds (Simple Dynamic String),Simple的意思是简 ...

  2. redis源码笔记 - 刘浩de技术博客 - 博客园

    redis源码笔记 - 刘浩de技术博客 - 博客园 redis源码笔记 - 刘浩de技术博客 - 博客园 redis源码笔记 记录发现的一个hiredis的bug 摘要: hiredis是redis ...

  3. Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景

    Redis源码-String:Redis String命令.Redis String存储原理.Redis String三种编码类型.Redis字符串SDS源码解析.Redis String应用场景 R ...

  4. Redis源码阅读笔记(1)——简单动态字符串sds实现原理

    首先,sds即simple dynamic string,redis实现这个的时候使用了一个技巧,并且C99将其收录为标准,即柔性数组成员(flexible array member),参考资料见这里 ...

  5. Redis源码解析——双向链表

    相对于之前介绍的字典和SDS字符串库,Redis的双向链表库则是非常标准的.教科书般简单的库.但是作为Redis源码的一部分,我决定还是要讲一讲的.(转载请指明出于breaksoftware的csdn ...

  6. Redis源码解析——前言

    今天开启Redis源码的阅读之旅.对于一些没有接触过开源代码分析的同学来说,可能这是一件很麻烦的事.但是我总觉得做一件事,不管有多大多难,我们首先要在战略上蔑视它,但是要在战术上重视它.除了一些高大上 ...

  7. Redis源码分析:基础概念介绍与启动概述

    Redis源码分析 基于Redis-5.0.4版本,进行基础的源码分析,主要就是分析一些平常使用过程中的内容.仅作为相关内容的学习记录,有关Redis源码学习阅读比较广泛的便是<Redis设计与 ...

  8. redis源码客户端和服务端通信过程

    最近想学习一下redis源码,先看一下redis通信流程.由于功力有限,不足之处望大家指正.服务端和客户端通信,一般都是服务端先启动,那先从服务端的源码看起. 首先启动服务端会做一些初始化动作,初始化 ...

  9. redis源码阅读(1)

    redis 是c 编写的,首先看下redis 代码目录结构(对应版本3.25): 开发相关的放在deps下面: 主要代码放置在deps和src下面,utils 下面放置的是rb 脚本 首先看下src ...

  10. Redis源码分析之工具类util

    在redis源码中的辅助工具类中,主要包括大小端转换.SHA算法以及util.h中对应的算法. 大小端转换: LittleEndian:低位字节数据存放于低地址,高位字节数据存放于高地址. BigEn ...

最新文章

  1. 深度学习博士发出灵魂拷问:我是在做算法还是在调参?
  2. PHP 解析xml(包含非英文字符)
  3. python中的out of loop_TclError: out of stack space (infinite loop?)
  4. 九章算术卷第五 商功
  5. 五、工作量证明链解决拜占庭将军问题之模拟程序(Objective-C)
  6. hive 两个没有null指定的表左关联的结果有null_Hive的优化原则
  7. PHP Web Shell in browser
  8. html3d变形,深入理解CSS变形transform(3d) - 小火柴的蓝色理想
  9. 使用 Lvs + Nginx 集群搭建高并发架构
  10. 关于Ubuntu python程序利用lixb264生成h264格式的视频相关问题
  11. fluidsim元件库下载_模块七FluidSIM软件应用 (1)
  12. U盘数据恢复免费破解版哪里有?
  13. php studay,studay是什么意思
  14. MT6573_FlashTool 下载的使用说明
  15. 图片裁切以及图片预览的过程
  16. c语言编程单片机中的sbit,用sbit定义可位寻址的特殊功能寄存器时的地址转换-51单片机C编程...
  17. 【WinForm】关于截图识别数字并计算的桌面程序实现方案
  18. 资产证券化(ABS)+ 特殊目的信托(SPV)
  19. [汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)
  20. 苹果开发者账号申请流程说明

热门文章

  1. 以后有面试官问你「密码学」,你就把这篇文章扔给他
  2. PM_09 十大管理之项目人力资源管理(六)
  3. Edge打不开出现指定路径不存在的问题
  4. 天猫精灵服务器修改密码,天猫精灵怎么解绑 天猫精灵解绑账号方法
  5. Javaweb实现登录界面“记住我”功能
  6. 在matlab下使用预训练模型Alex Net进行迁移学习的实验与分析
  7. no zuo no die _0_
  8. 一起学Kubernetes——设计概览
  9. 最适合程序员敲代码用的显示器,包邮送!
  10. 【目标检测适用】Pascal Voc(07+12)联合训练并在07上测试