Redis源码解析:01简单动态字符串SDS

        Redis没有直接使用C字符串(以’\0’结尾的字符数组),而是构建了一种名为简单动态字符串( simple  dynamic  string, SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。在Redis里面,C字符串只会作常量值,比如打印日志:

redisLog(REDIS_WARNING,"Fatal: Can't initialize Background Jobs.");

        当Redis需要一个可被修改的字符串时,就会使用SDS来表示字符串值,在Redis中,包含字符串值的键值对在底层都是由SDS实现的。比如执行下面的命令:

redis> rpush fruits "apple" "banana" "cherry"
(integer) 3

        Redis将在数据库中创建一个新的key-value对,其中:

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

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

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

 

1:SDS的定义

         在sds.h中,定义了结构体sdshdr表示SDS,其定义如下:

struct sdshdr {
    unsigned int len;
    unsigned int free;
    char buf[];
};

         len记录buf中已使用的字节数量,也就是SDS保存的字符串的长度(不包括末尾的’\0’);free记录buf中未使用的字节数量(也不包括’\0’);buf是字节数组,用于保存字符串。比如下面的例子:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值