上一章:Redis-数据结构01-压缩列表(ziplist)
下一章:Redis-数据结构03-跳跃表(skiplist)

一:sds的结构体
简单动态字符串(Simple Dynamic Strings,SDS)是Redis的基本数据结构之一,用于存储字符串和整型数据。SDS兼容C语言标准字符串处理函数,且在此基础上保证了二进制安全,等同于Java当中的String类的实现

上面这句话是官方定义,然而SDS的实现我个人觉得和C++的string类基本差不多都是由长度来控制char数组,而不是c语言的’\0’,所以我们可以简单的认为sds大致的结构体如下

struct sds {int len;// buf 中已占用字节数int free;// buf 中剩余可用字节数char buf[];// 数据空间
};

上述结构体int占用4个字节,假如我只存放一个很短的字符串,int依然很大,就这个问题,redis将字符串拆分成了5种情况

#define SDS_TYPE_5  0 //字符串长度小于32的,比如"abcd"长度=4
#define SDS_TYPE_8  1 //字符串长度小于2的8次方的
#define SDS_TYPE_16 2 //字符串长度小于2的16次方的
#define SDS_TYPE_32 3 //字符串长度小于2的32次方的
#define SDS_TYPE_64 4 //字符串长度小于2的64次方的

SDS_TYPE_5的结构体定义

struct sdshdr5 {unsigned char flags; /* 低3位存储类型, 高5位存储长度 */char buf[];/*柔性数组,存放实际内容*/
};

SDS_TYPE_8的结构体定义

struct sdshdr8 {uint8_t len; /* 已使用长度,用1字节存储 */uint8_t alloc; /* 总长度,用1字节存储*/unsigned char flags; /* 低3位存储类型, 高5位预留 */char buf[];/*柔性数组,存放实际内容*/
};

SDS_TYPE_16的结构体定义

struct sdshdr16 {uint16_t len; /*已使用长度,用2字节存储*/uint16_t alloc; /* 总长度,用2字节存储*/unsigned char flags; /* 低3位存储类型, 高5位预留 */char buf[];/*柔性数组,存放实际内容*/
};

SDS_TYPE_32的结构体定义

struct sdshdr32 {uint32_t len; /*已使用长度,用4字节存储*/uint32_t alloc; /* 总长度,用4字节存储*/unsigned char flags;/* 低3位存储类型, 高5位预留 */char buf[];/*柔性数组,存放实际内容*/
};

SDS_TYPE_64的结构体定义

struct sdshdr64 {uint64_t len; /*已使用长度,用8字节存储*/uint64_t alloc; /* 总长度,用8字节存储*/unsigned char flags; /* 低3位存储类型, 高5位预留 */char buf[];/*柔性数组,存放实际内容*/
};

上述结构体定义我省略了’attribute((packed))’,redis原定义是

// 其中__attribute__((__packed__))表示取消字节对齐,为了更省内存
// 同时,若没有packed的修饰,还需要对不同结构进行处理,实现更复杂
struct __attribute__((__packed__))sdshdrXXX

二:sds释放内存

void sdsclear(sds s) {sdssetlen(s, 0); //统计值len归零s[0] = '\0';//清空buf
}

为了优化性能(减少申请内存的开销),SDS提供了不直接释放内存,而是通过重置统计值达到清空目的的方法——sdsclear。该方法仅将SDS的len归零,此处已存在的buf并没有真正被清除,新的数据可以覆盖写,而不用重新申请内存。
三:sds字符串拼接
字符串拼接使用memcpy函数,下面是redis字符串拼接的原理(不是源代码,但是与源代码原理本质上是相同的)

char a[] = "def";
char b[6] = "ABC";
memcpy(b+3,a,3);
// 打印出ABCdef
for (char c:b) {std::cout << c << std::endl;
}

上一章:Redis-数据结构01-压缩列表(ziplist)
下一章:Redis-数据结构03-跳跃表(skiplist)

Redis-数据结构02-简单动态字符串(sds)相关推荐

  1. Redis数据结构之简单动态字符串SDS

    Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...

  2. Redis内部数据结构详解之简单动态字符串(sds)

    本文所引用的源码全部来自Redis2.8.2版本. Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c. 转载请注明,本文出自:http://blog.csdn.ne ...

  3. Redis源码初探(1)简单动态字符串SDS

    前言 现在面试可太卷了,Redis基本是必问的知识点,为了在秋招中卷过其他人(虽然我未必参加秋招),本菜鸡决定从源码层面再次学习Redis,不过鉴于本菜鸡水平有限,且没有c语言基础,本文不会对源码过于 ...

  4. Redis数据结构——简单动态字符串-SDS

    1.SDS简介: redis没有使用C语言传统的字符串表示(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(SDS)的抽象类型,并将SDS用作redis的默认字符串表示. 除了用来保存 ...

  5. Redis之简单动态字符串sds

    转载:https://segmentfault.com/a/1190000012262739 redis在处理字符串的时候没有直接使用以'\0'结尾的C语言字符串,而是封装了一下C语言字符串并命名为s ...

  6. 【Redis笔记】简单动态字符串(SDS)

    简单动态字符串:simple dynamic string ,SDS,用作Redis默认字符串表示. 在Redis中,C字符串只会作为字符串字面量用在一些无须对字符串值进行修改的地方. 在Redis需 ...

  7. Redis源码剖析(十)简单动态字符串sds

    在对象系统概述中发现,好像所有和字符串有关的内容都有sds的存在,实际上,它是Redis内部对于c字符串的封装,所谓c字符串,其实就是char *,在sds.h头文件中可以清楚的看到它的定义 //sd ...

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

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

  9. 【redis源码学习】simple dynamic strings(简单动态字符串 sds)

    文章目录 接 化 sds 结构分析 基本操作 创建字符串 释放字符串 sdsMakeRoomFor 扩容 小tip:`__attribute__ ((__packed__))` 发 接 阅读源码之前, ...

  10. redis笔记_源码_简单动态字符串SDS

    参照:https://zcheng.ren/sourcecodeanalysis/theannotatedredissourcesds/#sds%E5%B0%8F%E7%BB%93 这里用char b ...

最新文章

  1. linux系统的学习经验首篇
  2. IEEE802.11e EDCA 中TXOP机制的分析与改进
  3. IntelliJ IDEA 超实用技巧分享,不能再全了!
  4. 爬取许嵩新歌《雨幕》弹幕,告诉你什么才是真正的创作!
  5. Restful Service 中 DateTime 在 url 中传递
  6. Word2013中制作按钮控件
  7. Android 应用开发(33)---Android程序签名打包
  8. Linux 命令(65)—— ld 命令
  9. iOS中书写代码规范35条小建议
  10. 论文实录 | 毕业设计如何做需求分析?
  11. Java使用while循环计算调和数列的和并打印
  12. python并行爬虫
  13. 重拾呐些記憶,前面の路,獨自繼續前往。
  14. 高清影音发展的产物格式转换器
  15. BoBo买了一箱酸奶,里面有n盒未打开的酸奶,KiKi喜欢喝酸奶,第一时间发现了酸奶。KiKi每h分钟能喝光一盒酸奶,并且KiKi在喝光一盒酸奶之前不会喝另一个,那么经过m分钟后还有多少盒未打开的酸奶
  16. XV6实验-Lab1 Syscalls
  17. Java实现短信验证码最佳实践
  18. GPU Profiling 101
  19. Ubuntu 查看磁盘空间大小命令
  20. 山狮来临,Notes何往

热门文章

  1. java 三种错误类型 区别_请列举至少三种在java语言中发生“严重错误”的情况...
  2. java 获取服务器IP地址及MAC地址
  3. Python中的Monkey Patch(猴子补丁)
  4. Opatch java 路径_Windows平台下opatch apply报错:OUI-67073
  5. oracle控制文件还原,Oracle的控制文件的恢复与重建
  6. Apache Log4j2远程JNDI代码执行漏洞修复
  7. mysql 查询默认编码_查看及修改MYSQL默认编码
  8. mysql丢失数据_MySQL数据丢失问题
  9. mysql存储引擎 sql_MySQL——存储引擎与SQL数据类型
  10. 上一页下一页html样式,软件 | hexo博客主题yilia上一页下一页显示的问题