redis源码浅见之sds
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相关推荐
- Redis源码分析(sds)
源码版本:redis-4.0.1 源码位置:https://github.com/antirez/sds 一.SDS简介 sds (Simple Dynamic String),Simple的意思是简 ...
- redis源码笔记 - 刘浩de技术博客 - 博客园
redis源码笔记 - 刘浩de技术博客 - 博客园 redis源码笔记 - 刘浩de技术博客 - 博客园 redis源码笔记 记录发现的一个hiredis的bug 摘要: hiredis是redis ...
- 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 ...
- Redis源码阅读笔记(1)——简单动态字符串sds实现原理
首先,sds即simple dynamic string,redis实现这个的时候使用了一个技巧,并且C99将其收录为标准,即柔性数组成员(flexible array member),参考资料见这里 ...
- Redis源码解析——双向链表
相对于之前介绍的字典和SDS字符串库,Redis的双向链表库则是非常标准的.教科书般简单的库.但是作为Redis源码的一部分,我决定还是要讲一讲的.(转载请指明出于breaksoftware的csdn ...
- Redis源码解析——前言
今天开启Redis源码的阅读之旅.对于一些没有接触过开源代码分析的同学来说,可能这是一件很麻烦的事.但是我总觉得做一件事,不管有多大多难,我们首先要在战略上蔑视它,但是要在战术上重视它.除了一些高大上 ...
- Redis源码分析:基础概念介绍与启动概述
Redis源码分析 基于Redis-5.0.4版本,进行基础的源码分析,主要就是分析一些平常使用过程中的内容.仅作为相关内容的学习记录,有关Redis源码学习阅读比较广泛的便是<Redis设计与 ...
- redis源码客户端和服务端通信过程
最近想学习一下redis源码,先看一下redis通信流程.由于功力有限,不足之处望大家指正.服务端和客户端通信,一般都是服务端先启动,那先从服务端的源码看起. 首先启动服务端会做一些初始化动作,初始化 ...
- redis源码阅读(1)
redis 是c 编写的,首先看下redis 代码目录结构(对应版本3.25): 开发相关的放在deps下面: 主要代码放置在deps和src下面,utils 下面放置的是rb 脚本 首先看下src ...
- Redis源码分析之工具类util
在redis源码中的辅助工具类中,主要包括大小端转换.SHA算法以及util.h中对应的算法. 大小端转换: LittleEndian:低位字节数据存放于低地址,高位字节数据存放于高地址. BigEn ...
最新文章
- 深度学习博士发出灵魂拷问:我是在做算法还是在调参?
- PHP 解析xml(包含非英文字符)
- python中的out of loop_TclError: out of stack space (infinite loop?)
- 九章算术卷第五 商功
- 五、工作量证明链解决拜占庭将军问题之模拟程序(Objective-C)
- hive 两个没有null指定的表左关联的结果有null_Hive的优化原则
- PHP Web Shell in browser
- html3d变形,深入理解CSS变形transform(3d) - 小火柴的蓝色理想
- 使用 Lvs + Nginx 集群搭建高并发架构
- 关于Ubuntu python程序利用lixb264生成h264格式的视频相关问题
- fluidsim元件库下载_模块七FluidSIM软件应用 (1)
- U盘数据恢复免费破解版哪里有?
- php studay,studay是什么意思
- MT6573_FlashTool 下载的使用说明
- 图片裁切以及图片预览的过程
- c语言编程单片机中的sbit,用sbit定义可位寻址的特殊功能寄存器时的地址转换-51单片机C编程...
- 【WinForm】关于截图识别数字并计算的桌面程序实现方案
- 资产证券化(ABS)+ 特殊目的信托(SPV)
- [汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)
- 苹果开发者账号申请流程说明
热门文章
- 以后有面试官问你「密码学」,你就把这篇文章扔给他
- PM_09 十大管理之项目人力资源管理(六)
- Edge打不开出现指定路径不存在的问题
- 天猫精灵服务器修改密码,天猫精灵怎么解绑 天猫精灵解绑账号方法
- Javaweb实现登录界面“记住我”功能
- 在matlab下使用预训练模型Alex Net进行迁移学习的实验与分析
- no zuo no die _0_
- 一起学Kubernetes——设计概览
- 最适合程序员敲代码用的显示器,包邮送!
- 【目标检测适用】Pascal Voc(07+12)联合训练并在07上测试