简单动态字符串

Redis只在一些无需对字符串进行修改的地方使用C字符串,大部分时候使用简单动态字符串simple dynamic string, SDS),字符串的抽象类型。二进制安全,可以存放任意格式的数据。

定义

 1 源码(部分):
 2 struct __attribute__ ((__packed__)) sdshdr5 {
 3     unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
 4     char buf[];
 5 };
 6 struct __attribute__ ((__packed__)) sdshdr8 {
 7     uint8_t len; /* used */
 8     uint8_t alloc; /* excluding the header and null terminator */
 9     unsigned char flags; /* 3 lsb of type, 5 unused bits */
10     char buf[];
11 };
12 书中代码:
13 struct sdshdr {
14     int len;
15     int free;
16     char buf[];
17 }

这里以书中代码为基础,len为使用的字节数,free表示已分配但未使用的字节数。buf就是char型数组保存字符串。

这里需要注意的是SDS保存的字符串沿用C字符串的格式,会在最末尾加一个'\0'表示字符串结束,好处是可以复用C语言的函数库。

举个例子:“hello” len为5,如果free为0,那么这个字符串一共使用6字节,'\0'额外使用一个字节。

由定义我们可以了解到,SDS的长度可以O(1)获得,而且他使用的内存不是长度+1。而且具有二进制安全的性质。

空间分配策略

Redis为了减少内存分配的次数,采用了空间预分配惰性空间释放两种策略。

空间预分配

当需要对SDS进行空间扩展的时候,SDS不仅会分配修改所必须的空间,还会进行预分配。

如果修改后的len值小于1M,那么就会预分配和len同样大小的预留空间。也就是说经过修改和预分配len和free的值是相等的。这时候占有的字节数就是len+free+1。

而如果修改后的len值大于等于1M,那么就只预分配1M空间。

惰性空间释放

当API需要缩短SDS保存的字符串,并不会立即释放多出来的字节,而是使用free记录下来。这样避免了内存重分配的操作,并为将来可能的增长提供了优化。

如果确实需要释放未使用的空间,SDS也提供了相应的API。

优点总结

  • 常数时间复杂度获取字符串长度
  • 杜绝缓冲区溢出
  • 减少在修改字符串长度时内存分配的次数
  • 二进制安全
  • 兼容部分C字符串函数

转载于:https://www.cnblogs.com/Star-Dust-/p/10331765.html

《Redis设计与实现》阅读笔记(二)--简单动态字符串相关推荐

  1. 《Reids 设计与实现》第一章 简单动态字符串和链表

    <Reids 设计与实现>第一章 简单动态字符串和链表 文章目录 <Reids 设计与实现>第一章 简单动态字符串和链表 一.简单动态字符串 1.简介 2.SDS 的定义 3. ...

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

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

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

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

  4. c语言追加字符串_Redis源码解析二--简单动态字符串

    Redis 简单动态字符串 1.介绍 Redis兼容传统的C语言字符串类型,但没有直接使用C语言的传统的字符串(以'0'结尾的字符数组)表示,而是自己构建了一种名为简单动态字符串(simple dyn ...

  5. 【Redis】Redis数据结构与对象(一)简单动态字符串(SDS)

    目录 1. C字符串与SDS 2. SDS的定义 3. SDS与C字符串的区别 3.1 常数复杂度获取字符串长度 3.2 杜绝缓冲区溢出 3.3 减少修改字符串时带来的内存重分配次数 3.3.1 空间 ...

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

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

  7. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

  8. Redis 设计与实现 读书笔记(菜鸟版)

    Redis 设计与实现 读书笔记(简略版) 写在前面 第一章(内部数据结构) SDS List Dictionary Rehash Rehash 与 COW 渐进式Rehash 字典收缩 Skipli ...

  9. Redis设计与实现阅读总结(一)数据结构和对象

    大家有什么建议欢迎在下方评论提出,多多讨论 大家可能发现这个部分写的很粗略,因为redis本身设计的就是很简单的,这些数据结构基本没有太多好写的,主要是写 了后做一个总结 1. SDS(简单动态字符串 ...

最新文章

  1. etcd 日志压缩_etcd集群备份和数据恢复以及优化运维
  2. 灰色预测模型代码_生信审稿人最常问的验证!临床预测模型中的PCA主成分分析!这点你注意到了没!(附代码)...
  3. 微信多开txt_微信仅需3步操作,就能多开登录?手把手包教包会
  4. Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收(九)
  5. Prefix Sum Primes
  6. 云鲸扫拖一体机器人说明书_比老公更好用的扫拖一体机—自动洗拖布的云鲸扫拖机器人使用体验...
  7. UVA1374 Power Calcilus快速幂计算
  8. 狸窝音频剪辑软件_「附下载链接」常用的5款视频格式转换软件,收藏起来吧...
  9. 商汤3DAR团队-3D视觉组招聘
  10. Python_多进程编程
  11. 【华为云技术分享】ARM体系结构基础(2)
  12. 被骂垃圾货,却卖出8000万副,干翻国外大牌!这个产品杀手凭什么?
  13. Linux开机自动启动ORACLE设置
  14. 解决kafka传输超大图片消费者接收失败问题
  15. Windows本地域名转接
  16. PHP Web项目开发学习,经验谈
  17. 整理总结:深入浅出统计学——排列与组合
  18. 潭州学院html学习(day10)
  19. java白皮书是什么_Java SE 参考资料 — 白皮书 | Oracle 中国
  20. 【英语:基础进阶_语法进阶提升】F5.定语从句

热门文章

  1. golang rpc的两种调用方法
  2. 《JAVA与模式》之模板模式(转载)
  3. 网页中PNG透明背景图片的完美应用
  4. 脚本实现用户登录显示信息
  5. poj2352(树状数组)
  6. Lombok 原理分析与功能实现
  7. 大数据可视化及发展趋势
  8. 15-数据结构探险系列-图篇
  9. vim - ctags
  10. CSS里常见的块级元素和行内元素