Redis数据结构之简单动态字符串
Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将SDS用作Redis的默认字符串表示。在Redis中,C字符串只会作为字符串字面量,用在一些无需对字符串值进行修改的地方,例如打印日志。
一、SDS的结构定义

示例:

二、SDS与C字符串的区别
1. 常数复杂度获取字符串长度
C字符串长度计算:遍历整个字符串直至遇到代表字符串结尾的空字符,时间复杂度为O(N)。
SDS长度计算:只要访问SDS的'len'属性即可,时间复杂度为O(1)。
注:设置和更新SDS长度的工作是由SDS的API在执行时自动完成的,使用SDS无须进行任何手动修改长度的工作。
2. 杜绝缓冲区溢出
C字符串:增加长度时,需要开发者手动申请分配足够的空间,否则会发生缓冲区溢出。
SDS:SDS的空间分配交由SDS API自动实现,无需手动申请分配,不会发生缓冲区溢出。
3. 减少修改字符串时带来的内存重分配次数
C字符串:每次增长或缩短字符串,都需要进行一次内存重分配操作,否则会发生缓冲区溢出或内存泄漏。
SDS:通过使用"free"属性记录未使用空间,实现空间预分配和惰性空间释放两种优化策略,从而减少内存重分配次数。
(1)SDS空间预分配:
SDS API对SDS的空间进行扩展的时候,不仅会为SDS分配必需的空间,还会分配额外的未使用空间。若修改后SDS长度小于1M,则预分配和"len"一样大小的未使用空间;若修改后SDS长度大于等于1M,则预分配1M的未使用空间。以后再需要扩展SDS空间时,SDS API会优先使用SDS的"free"未使用空间。
(2)SDS惰性空间释放:
SDS API对SDS的空间进行缩短的时候,不会立即使用内存重分配来回收多余空间,而是使用"free"属性将这些空间的字节数量记录起来,等待以后使用。SDS也提供了相应的API,让我们可以在有需要时,真正地释放SDS中未使用的空间。
注:内存重分配涉及复杂的算法,并且可能需要执行系统调用,通常是一个比较耗时的操作,若频繁执行可能会对性能造成影响。
4. 二进制安全
C字符串:字符必须符合某种编码,而且除了字符串末尾,不能包含空字符,所以C字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据。
SDS:SDS API都是二进制安全的,可以保存任意格式的二进制数据。
5. 兼容部分C字符串函数
SDS API总会将SDS保存的数据末尾设置为空字符,所以若SDS保存的是文本数据,则可以重用一部分<string.h>库定义的函数,避免不必要的代码重复。
三、SDS在Redis中的用途
1. 在Redis的数据库中,包含字符串值的键值对在底层都是由SDS实现的。
2. 除此之外,SDS还被用作缓冲区,例如AOF模块的AOF缓冲区、客户端状态中的输入缓冲区。
Redis数据结构之简单动态字符串的更多相关文章
- Redis数据结构之简单动态字符串SDS
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...
- Redis 数据结构之简单动态字符串SDS
几个概念1:key对象 数据库存储键值对的键,总是一个字符串对象.2:value对象 数据库存储键值对的值,可以是字符串对象,list对象,hash对象,set对象,sorted set对象. ...
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
- redis 系列3 数据结构之简单动态字符串 SDS
一. SDS概述 Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默 ...
- redis 笔记01 简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表
文中内容摘自<redis设计与实现> 简单动态字符串 1. Redis只会使用C字符串作为字面量,在大多数情况下,Redis使用SDS(Simple Dynamic String,简单动态 ...
- Redis中的简单动态字符串
Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SD ...
- Redis核心原理-简单动态字符串SDS
SDS简介 Redis是C语言编写的,但没有使用c语言的字符串结构,而是自己实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理类似Ja ...
- 关于redis中SDS简单动态字符串
1.SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *).它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制 ...
- redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...
随机推荐
- CPP-基础:windows api 多线程---互斥量、信号量、临界值、事件区别
http://blog.csdn.net/wangsifu2009/article/details/6728155 四种进程或线程同步互斥的控制方法:1.临界区:通过对多线程的串行化来访问公共资源或一 ...
- AR报表控件的常见问题汇总
1)字符串格式不正确 原因是建立报表时未使用分页报表 导致拖动数据为sum()表达式,sum运算字符串当然会出问题 2)超出索引 顾名思义 数据为空或不匹配 3)图片使用远程图片时记得把属性修改为远程 ...
- ios之自定义UISwitch
系统自带的UISwitch是这样的: 既不能写字,也不能改颜色,于是在网上找到了这么一个自定义的Switch按钮,具体出处找不见了.记录一下,怕以后找不见了. 先看下效果图: 按钮的样式很多,可以文字 ...
- CSS实现跳动的桃心
又来刷题--CSS动画实现跳动的桃心,从哪里跌倒就从哪里爬起来,哈哈哈~ 分析:首先,得画出一个桃心,然后再用动画效果让它跳起来(关于动画,实在是弱项啊~~~,得补补了). 第一步:画桃心,思路是一个 ...
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- luogu P1966 火柴排队 (逆序对)
luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
- 初涉树形dp
算是一个……复习以及进阶? 什么是树形dp 树形dp是一种奇妙的dp…… 它的一个重要拓展是和各种树形的数据结构结合,比如说在trie上.自动机上的dp. 而且有些时候还可以拓展到环加外向树.仙人掌上 ...
- __new__.py
def func(self): print('hello %s' %self.name)def __init__(self,name,age): self.name = name self.age = ...
- 主DNS服务-反向解析
上篇说了主DNS正向解析 当中是有个小问题的,什么问题呢? 试问当我们输入wwww或ww或更多w的时候它还能解析出来吗? 或者不输入w的时候还能解析吗? 上篇没有定义是解析不了的,怎么定义呢?很简单, ...
- css3如何实现click后页面过渡滚动到顶部
var getTop = document.getElementById("get-top"); var head = document.getElementById(" ...