Redis 数据结构之-简单动态字符串(SDS)

Redis采用一种名为简单动态字符串(simple dynamic string,SDS)的数据结构做为默认字符串的表示。

并且在Redis中,只有常量采用默认C语言字符串表示,如果一个字符串是可变的就会采用SDS。 那么,首先让我们看下SDS数据结构(摘自Redis设计与实现一书)

struct sdshdr {
  // 记录buf数组中已使用字节的数量
  // 等于SDS所保存字符串的长度
  int len;
  // 记录buf数组中未使用字节的数量
  int free;
  // 字节数组,用于保存字符串
  char buf[];
  };

SDS

如上图,可以看到这个数据结构包含三部分:用于保存数据的字节数组,已使用子节的长度和未使用的字节的长度,通过这个设计相信有经验的工程师已经明白了设计者的思路或用意,正是通过未使用空间,SDS实现了空间预分配和惰性空间释放两种优化策略.

说说这两种优化策略的大概思想:

  • 空间预分配

当一个SDS最初被创建的时候,free=len,也就是创建的长度等于目标字符串长度;如上图,SDS起初长度为5(Redis),如果需要将这个字符串拼接上Cluster,SDS会预分配内存到(5+7)*2的长度,也就是总长度为拼接后的字符串长度乘以2,此时free=len,这就是SDS预分配时,针对修改后的字符串长度小于1MB时采用的策略;假如修改后的长度大于1MB,SDS会预分配1MB的未使用空间

  • 惰性空间释放

在SDS中,如果字符串在修改后长度变小,SDS并不会立即释放暂时不用的内存空间,而仅仅是修改len和free的值,等待将来使用,举个例子,假如第一次修改操作为缩短8个字节,此后一次修改操作为长度增加7字节,那么SDS就可以重复利用这8字节,通过惰性空间释放策略,SDS避免了缩短字符串时所需的内存重分配操作,并为将来可能有的增长操作提供了优化。 与此同时,SDS也提供了相应的API,让我们可以在有需要时,真正地释放SDS的未使用空间,所以不用担心惰性空间释放策略会造成内存浪费。

*** 二进制安全 ***

SDS采用字节数组保存原始数据,采用C末位一个字节为\0的表示方法实现与C函数的兼容,正因为采用的是字节数组才达到了二进制安全的效果,并非关键

综上,SDS同C的默认字符串实现相比,主要起到了以上两部分优化效果

转载于:https://my.oschina.net/jerrysearch/blog/790611

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值