Redis2-简单动态字符串
除了用来保存数据库中的字符串值之外,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-简单动态字符串相关推荐
- Redis内部数据结构详解之简单动态字符串(sds)
本文所引用的源码全部来自Redis2.8.2版本. Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c. 转载请注明,本文出自:http://blog.csdn.ne ...
- redis学习 -- 简单动态字符串
Redis没有使用C语言字符串的形式,通过'\0'作为结尾,而是使用了简单动态字符串(simple dynamic string). 当Redis使用的字符串不需要修改字符串的内容的时候,可以使用C语 ...
- 《Redis设计与实现》阅读笔记(二)--简单动态字符串
简单动态字符串 Redis只在一些无需对字符串进行修改的地方使用C字符串,大部分时候使用简单动态字符串(simple dynamic string, SDS),字符串的抽象类型.二进制安全,可以存放任 ...
- Redis简单动态字符串
简单动态字符串 Simple Dynamic String是Redis内部自己定义的一种数据类型 在Redis内部, 任何包含字符串的键值对都是由SDS实现的 SDS还被用于缓冲区, 比如AOF缓冲区 ...
- c 字符串数组_redis为什么不直接使用C字符串,而要自定义简单动态字符串?
来源:公众号[编程珠玑] 作者:守望先生 ID:shouwangxiansheng Redis (一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库.)没有直接使用 C ...
- Redis数据结构之简单动态字符串SDS
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...
- Redis之简单动态字符串sds
转载:https://segmentfault.com/a/1190000012262739 redis在处理字符串的时候没有直接使用以'\0'结尾的C语言字符串,而是封装了一下C语言字符串并命名为s ...
- Redis数据结构——简单动态字符串-SDS
1.SDS简介: redis没有使用C语言传统的字符串表示(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(SDS)的抽象类型,并将SDS用作redis的默认字符串表示. 除了用来保存 ...
- 《Reids 设计与实现》第一章 简单动态字符串和链表
<Reids 设计与实现>第一章 简单动态字符串和链表 文章目录 <Reids 设计与实现>第一章 简单动态字符串和链表 一.简单动态字符串 1.简介 2.SDS 的定义 3. ...
- c语言追加字符串_Redis源码解析二--简单动态字符串
Redis 简单动态字符串 1.介绍 Redis兼容传统的C语言字符串类型,但没有直接使用C语言的传统的字符串(以'0'结尾的字符数组)表示,而是自己构建了一种名为简单动态字符串(simple dyn ...
最新文章
- 增加自增列 耗时长_又一批长事务,P0故障谁来背锅?
- IAR之函数和变量的绝对地址定位
- how to deal with Demodex
- Qt修炼手册1_溢美之词和Designer设计
- python类型转换异常捕捉_Java中的异常
- 配置SQL Server 2012 AlwaysOn ——step1 建立AD域及DNS配置
- Ubuntu安装摄像头软件GTK_UVC_Viewer
- Go编译android,在Android中引用golang编译的aar包
- 泰山游记:道阻且长,活着走出
- 安装微软虚拟机的操作说明
- pic16f616单片机C语言编程,PIC16F616型单片机介绍
- android gps 获取方位_Android GPS定位 获取经纬度
- 维修三菱油妍服务器,三菱油研伺服驱动器常见报警AL17,AL19,AL1A
- 浙江大学-西湖大学联合培养博士生
- 有趣的USB接口和颜色分类
- 修身齐家治国平天下 读 战国策 和 编程卓越之道 有感
- 如何修改电脑用户文件名
- 金融数据分析与挖掘具体实现方法 -1
- word锁定:解决Word文档由于文档保护而无法修改、查找、编辑的方法
- word操作技巧:不同情况的文字统计方法
热门文章
- windows 64位PHP5.5配置xhprof
- Flink CDC 系列 - 实现 MySQL 数据实时写入 Apache Doris
- 基于 Flink 的实时数仓生产实践
- SuperIndicator开源库源码分析
- python自动化测试实战 虫师_Page Object 1 百度搜索实例 (虫师《selenium3自动化测试实战--基于Python语言笔记40》)...
- vue.js简单登录界面访问mysql_Vuejs实战项目:登陆页面
- char装cstring_MFC中char*,string和CString之间的转换-阿里云开发者社区
- python-学生管理系统--2录入学生信息内容以及代码
- 帆软日期参数联动方法
- Lync 小技巧-53-Windows 2012 R2-加域-电脑-自动-登录