1. Redis 没有直接使用c语言的字符串(以空字符结尾的字符数组),而是自己构建了一 种名为简单动态字符串(Simple Dynamic String , SDS),并将SDS做为          redis的默认字符串。

2.在redis数据库里面,包含字符串的键值对,底层都是由SDS实现的。

3.举例说明:

  (1)在redis客户端执行:set msg "HelloWorld" ,那么,redis在数据库中将会创建一个新的键值对。键值对的键对象的底层实现,是由一个保存着字符串msg的SDS实现的。

    键值对的值是一个保存着HelloWorld的SDS.

  (2) 执行:set fruit  "apple" "banana" "orange" ,那么,键值对的键是一个保存着fruit字符串的SDS。

    键值对的值是一个列表对象,列表对象,包含三个字符串对象,三个字符串对象底层分别由三个SDS实现。

4.SDS的实义

  如图:

  

(1)free 属性为0,表示这个SDS没有分配任何未使用空间。

(2)len 属性为5,表示这个SDS保存着一个5字节长的字符串

(3)buf 属性是一个char类型的数组,数组的前五个字节分别保存了,'R' 'e' 'd' 'i' 's' ,而最后一个字节保存了空字符 '\0' (以空字符结尾),最后一个空字节不计算在len属性里面。

下图是另一个例子,free是5,表示SDS为buf分配了5个未使用的字节空间。

5.SDS的空间优化策略

  (1) 空间预分配

    a. 对SDS进行修改后,如果SDS的长度小于1M,那么程序将分配和SDS的len属性相同大小的未使用空间,这时SDS的len属性值将和free属性值相同

  如果修改后SDS的len变成13字节,那么程序将会给SDS再分配13字节的未使用空间,SDS的buf数组的长度为13+13+1(空字符结尾)=27字节。

    b. 如果对SDS修改之后,SDS的长度大于1M,那么程序将分配1M的未使用空间给SDS。

  如果修改后SDS的len变成3M,那么buf的长度是 3M+3M+1byte

     通过这种预分配策略,SDS将连续增长N次字符串的内存重分配次数,从必定N,降低为最多N。

  (2)惰性空间释放策略

    当需要缩短SDS保存的字符串时,程序并不使用内存重分配,来回收缩短之后多出来的字节。而是使用free属性将这些字节记录下来,并等待将来使用。

  举例说明:

  如果SDS存的是 abcdefghij 现在删除hij,会将sds修改成如下图,free属性变为3,这样如果将来要对SDS进行增长操作的话,就不用重新分配内存空间。

另:SDS提供了相应的api用于释放内存空间,所以不用担心内存浪费。(有时间把图补上)

redis.1--SDS结构的更多相关文章

  1. 【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在 ...

  2. Redis学习——SDS字符串源码分析

    0. 前言 这里对Redis底层字符串的实现分析,但是看完其实现还没有完整的一个概念,即不太清楚作者为什么要这样子设计,只能窥知一点,需要看完redis如何使用再回头来体会,有不足之处还望告知. 涉及 ...

  3. 关于redis中SDS简单动态字符串

    1.SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *).它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制 ...

  4. Redis数据存储结构之String

    前言: 在Redis使用中,我们最常使用的操作是set key value,或 get key value .这里面包含了redis最基本的数据类型:String,字符串类型是redis中最基本的类型 ...

  5. redis字符串-sds

    redis自己实现了一种名为简单动态字符串的抽象类型(simple dynamic string)作为字符串的表示.下面将简单介绍sds的实现原理. 一.sds的结构

  6. 【Redis源代码剖析】 - Redis内置数据结构之字典dict

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51018337 今天我们来讲讲Redis中的哈希表. 哈希表在C++中相应的是ma ...

  7. redis学习-sds数据类型

    今天开始了redis的学习,本来想直接从源码看起的,不过看到有篇对redis介绍的基础教程 <Redis 设计与实现(第一版)> 于是决定从这个开始入门. 1.数据类型定义 typedef ...

  8. Redis 基础设计结构之四 set(集合)

    Redis 有 5 种基础数据结构,分别为:string (字符串).list (列表).set (集合).hash (哈希) 和 zset (有序集合). 今天来说一下set(集合)这种存储结构,s ...

  9. Redis 基础设计结构之三 hash(哈希)

    Redis 有 5 种基础数据结构,分别为:string (字符串).list (列表).set (集合).hash (哈希) 和 zset (有序集合). 今天来说一下hash(哈希),hash的数 ...

  10. Go redis hash存储结构体

    需求 需要存储用户数据到redis,结构是hash. 然后取出来,自动转成结构体. 结构体 type UserCache struct { Id int64 `json:"id"` ...

随机推荐

  1. Java线程池的那些事

    熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...

  2. PMD(Put Me Down)用例测试

    PMD(Put Me Down)--用例测试 一.测试工作安排 6个成员随机分配一个模块进行测试,测试完成后将最后的结果汇总到测试用例文档中. 二.测试工具的选择与运用 测试工具选择:这次还没用工具, ...

  3. 【Beta版本】冲刺-Day2

    队伍:606notconnected 会议时间:12月10日 目录 一.行与思 二.站立式会议图片 三.燃尽图 四.代码Check-in 一.行与思 张斯巍(433) 今日进展:对登录界面做了相应的修 ...

  4. 用GDB调试程序(一)

    http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或 ...

  5. VIM for Python and Django Development

    VIM for Python and Django Development VIM-PyDjango created by Programmer for Programmer who work on ...

  6. C++ 内存管理与堆栈

    /*内存管理与堆栈: * # 一个由C/C++编译的程序占用的内存分为以下几个部分 * 1.栈区:由编译器自动分配释放,数据先进后出 * 2.堆区:由程序员手动分配释放,数据先进先出, * new 和 ...

  7. Unity3D Sprite Draw Call合批规则

    只要材质相同,并Sprite在同一Atlas里,就可以合批. 不论Sorting Layer不同,还是Sorting Order不同. 材质相同的两个不同Sorting Order之间插入一个不同材质 ...

  8. document.body.scrollTop用法

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  9. JAVA JLabel自定义子类无法显示

    import java.awt.*; import java.util.Scanner; import javax.swing.*; public class Test_16_13 extends J ...

  10. Robot Framework--04 工作区

    转自:http://blog.csdn.net/tulituqi/article/details/7592711 一:Edit 接着前面的来,重新打开我们的RIDE,你会发现之前最后加的Resourc ...