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用于释放内存空间,所以不用担心内存浪费。(有时间把图补上)

最新文章

  1. 软件工程:Wordcount程序作业
  2. Bootstrap<基础十六> 导航元素
  3. Ubuntu 13.10下Hadoop 2.2 安装、配置、编译(伪分布式)
  4. Copying Rowsets
  5. 从零开始学ios开发(十七):Storyboards(上)
  6. 文件上传(FileUpload控件)
  7. UIProgressView-初识IOS
  8. C++用于修饰的keyword
  9. XP 右键扩展设置 1.0 免费绿色版
  10. 学学简单的-------------javaScript基础
  11. 前端解读Webview
  12. 解决SVN Cleanup错误: Failed to run the WC DB work queue associated with
  13. [Linux] Configure iSCSI on Linux5 (both target and initiator)
  14. Bootstrap 使用
  15. Confluence 6 数据库整合的限制
  16. Springboot学习笔记(三)-常用注入组件方式
  17. macOS 升级后重装命令行工具的问题
  18. Kafka C++客户端库librdkafka笔记
  19. 【树】Unique Binary Search Trees
  20. sql中替换换行符和空格的示例

热门文章

  1. linux 学习基础7之脚本的练习
  2. Character literal must contain exactly one character -- 一天一点小知识
  3. JAVASE 面试总结(1)
  4. ionic 发送请求返回一直都是404
  5. SOA 和webservice 的区别
  6. uC/OS-II全局变量定义
  7. TP中验证码的实现
  8. Windows XP SP3 Professional 微软(MSDN)官方原版系统
  9. Java——字符集:Charset
  10. Android学习笔记——CheckBox