除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区(buffer):AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区,都是由SDS实现的。

一、SDS的定义

每个sds.h/sdshdr结构表示一个SDS值:


上图表示了一个SDS实例:

  • free属性的值为0,表示这个SDS没有分配任何未使用空间
  • len属性的值为5,表示这个SDS保存了一个五字节长的字符串
  • buf属性是一个char类型的数组,数组的前五个字节分别保存了’R’, ‘e’, ‘d’, ‘i’, ‘s’五个字符,而最后一个字节则保存了空字符’\0’。

下图展示了另一个SDS实例。这个SDS和上面的一样,都保存了字符串值“Redis”,这个SDS和之前展示的SDS的区别在于,这个SDS为buf数组分配了五字节未使用空间,所以它的free属性的值为5.

二、SDS与C字符串的区别

2.1 常数复杂度获取字符串长度





通过使用SDS而不是C字符串,Redis将获取字符串长度所需的复杂度从O(N)降低到了O(1),这确保了获取字符串长度的工作不会成为Redis的性能瓶颈。例如,因为字符串键在底层使用SDS来实现,所以即使我们对一个非常长的字符串键反复执行STRLEN命令,也不会对系统性能造成任何影响,因为该命令的时间复杂度仅为O(1)。

2.2 杜绝缓冲区溢出

2.3 减少修改字符串时带来的内存重分配次数

2.4 二进制安全

2.5 兼容部分C字符串函数

Redis2-简单动态字符串相关推荐

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

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

  2. redis学习 -- 简单动态字符串

    Redis没有使用C语言字符串的形式,通过'\0'作为结尾,而是使用了简单动态字符串(simple dynamic string). 当Redis使用的字符串不需要修改字符串的内容的时候,可以使用C语 ...

  3. 《Redis设计与实现》阅读笔记(二)--简单动态字符串

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

  4. Redis简单动态字符串

    简单动态字符串 Simple Dynamic String是Redis内部自己定义的一种数据类型 在Redis内部, 任何包含字符串的键值对都是由SDS实现的 SDS还被用于缓冲区, 比如AOF缓冲区 ...

  5. c 字符串数组_redis为什么不直接使用C字符串,而要自定义简单动态字符串?

    来源:公众号[编程珠玑] 作者:守望先生 ID:shouwangxiansheng Redis (一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库.)没有直接使用 C ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 增加自增列 耗时长_又一批长事务,P0故障谁来背锅?
  2. IAR之函数和变量的绝对地址定位
  3. how to deal with Demodex
  4. Qt修炼手册1_溢美之词和Designer设计
  5. python类型转换异常捕捉_Java中的异常
  6. 配置SQL Server 2012 AlwaysOn ——step1 建立AD域及DNS配置
  7. Ubuntu安装摄像头软件GTK_UVC_Viewer
  8. Go编译android,在Android中引用golang编译的aar包
  9. 泰山游记:道阻且长,活着走出
  10. 安装微软虚拟机的操作说明
  11. pic16f616单片机C语言编程,PIC16F616型单片机介绍
  12. android gps 获取方位_Android GPS定位 获取经纬度
  13. 维修三菱油妍服务器,三菱油研伺服驱动器常见报警AL17,AL19,AL1A
  14. 浙江大学-西湖大学联合培养博士生
  15. 有趣的USB接口和颜色分类
  16. 修身齐家治国平天下 读 战国策 和 编程卓越之道 有感
  17. 如何修改电脑用户文件名
  18. 金融数据分析与挖掘具体实现方法 -1
  19. word锁定:解决Word文档由于文档保护而无法修改、查找、编辑的方法
  20. word操作技巧:不同情况的文字统计方法

热门文章

  1. windows 64位PHP5.5配置xhprof
  2. Flink CDC 系列 - 实现 MySQL 数据实时写入 Apache Doris
  3. 基于 Flink 的实时数仓生产实践
  4. SuperIndicator开源库源码分析
  5. python自动化测试实战 虫师_Page Object 1 百度搜索实例 (虫师《selenium3自动化测试实战--基于Python语言笔记40》)...
  6. vue.js简单登录界面访问mysql_Vuejs实战项目:登陆页面
  7. char装cstring_MFC中char*,string和CString之间的转换-阿里云开发者社区
  8. python-学生管理系统--2录入学生信息内容以及代码
  9. 帆软日期参数联动方法
  10. Lync 小技巧-53-Windows 2012 R2-加域-电脑-自动-登录