• 简单动态字符串


      Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。

      当Redis需要的不仅仅是一个字符串面量,而是一个可以被修改的字符串值时,Redis就会使用SDS来表示字符串值,比如在Redis的数据库里,包含字符串值得键值对在底层都是由SDS来实现得。

      客户端执行命令

        set msg "hello world"

      那么Redis将在数据库中创建一个新得键值对,其中

        键值对得键是一个字符串对象,对象得底层实现是一个保存着字符串“msg”的SDS

        键值对的值也是一个字符串对象,对象的底层实现是一个保存着字符串“hello world”的SDS

      又比如,客户端执行命令

        rpush fruits “apple” “banana” “cherry”

      那么Redis将在数据库中创建一个新的键值对,其中

         键值对的键是一个字符串对象,对象底层实现是一个保存了字符串“fruits”的SDS

         键值对的值是一个列表对象,列表对象包含了三个字符串对象,这三个字符串对象分别由三个SDS实现:第一个SDS保存着字符串“apple”,第二个SDS保存着字符串“banana”,第三个SDS保存着字符串“cherry”

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

    一、SDS的定义

    结构如下图

      

      free 属性的值为0,表示这个SDS没有分配任何未使用空间

      len 属性的值为5,表示这个SDS保存了一个五字节长的字符串

      buf 属性是一个char类型的数组,最后一个字节保存了空字符“”

      SDS遵循C字符串以空字符串结尾的惯例,保存空字符的1字节空间不计算在SDS的len属性里,并为空字符分配额外的1字节空间,以及添加空字符到字符串末尾等操作,都是由SDS函数自动完成的,所以这个空字符对于SDS的使用者来说是完全透明的。

    遵循空字符结尾的这一惯例的好处是,SDS可以直接重用一部分C字符串函数库里的函数。

        

      图2.2展示了另一个SDS实例,这个SDSbuf数组分配了5个未使用空间,free属性为5

    二、SDS与C字符串区别

      传统C语言使用长度为N+1的字符数组来表示长度为N的字符串

      

      C语言使用的这种简单的字符串表示方式,并不能满足Redis对字符串在安全性、效率以及功能方面的要求。

      1.常数复杂度获取字符串长度

      2.杜绝缓冲区溢出

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

      4.二进制安全

      5.兼容部分C字符串函数

  • 相关阅读:
    JavaScript 学习笔记 事件二
    auto_ptr
    POJ2299 UltraQuickSort(逆序对个数)
    2016年11月2日22:28:14
    将sql server中的数据倒入Excel(c#)
    线段树成段更新裸题POJ3468
    线段树成断更新裸题hdu1698 Just a Hook
    POJ2828 思维难度较好的一道线段树
    < 弱牛刷贪心给JerryDung&qiuwei大神Orz>最大乘积
    NOIP 2008 传纸条题解[双线程DP]
  • 原文地址:https://www.cnblogs.com/huan30/p/12105087.html
Copyright © 2020-2023  润新知