Redis底层String的存储结构(动态字符串,simple dynamic string,SDS)、通信协议RESP

SDS

参考:简单动态字符串(simple dynamic string)-SDS
Redis由于各种原因,并没有直接使用了C语言的字符串结构,而是对其做了一些封装,得到了自己的简单动态字符串(simple dynamic string, SDS)的抽象类型。Redis中,默认以SDS作为自己的字符串表示。只有在一些字符串不可能出现变化的地方使用C字符串。

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

free属性的值为0,表示这个SDS没有分配任何未使用空间。
len属性的值为5,表示这个SDS保存了一个五字节长的字符串。
buf属性是一个char类型的数组,数组的前五个字节分别保存了’R’、‘e’、‘d’、‘i’、‘s’五个字符,而最后一个字节则保存了空字符’\0’。

C语言与SDS的区别在于:

  • O(1)常数复杂度获取字符串长度:在字符串长度上面的区别总结起来就是:C语言没有记录长度,而SDS记录了长度。这样的做法,也会使得C语言在获得自身字符串长度时复杂度为O(N)(从头开始遍历直到遍历到空字符串)而SDS记录了自身长度获取自身长度的复杂度为O(1)。
  • 杜绝缓冲区溢出:C语言由于不记录字符串长度,在某些操作时会造成溢出。而SDS记录了长度,在空间分配时SDS API(设置和修改SDS长度由SDSAPI自动执行)对SDS进行修改时,API会先检查SDS空间是否能够满足操作需求。如果不满足API会根据执行的操作需求重新修改SDS长度。这样杜绝了溢出的情况。
  • C语言,由于不记录自身长度,并且底层的实现是是N+1个字符长的数组,因此如果有对字符串的修改需要按照操作重新分配空间,否则就容易溢出。而SDS通过未使用空间(free属性记录未使用的空间)的分配将字符串长度和底层字符串长度分开(SDS中的底层buf[ ] 不一定等于 字符串长度)。这样的方式使得SDS实现了空间预分配和惰性空间释放。

RESP

Redis服务器与客户端通过RESP(REdis Serialization Protocol,Redis串行化协议)协议通信。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。RESP传输的最小单元类型:

  • 单行字符串: 以 + 符号开头
  • 多行字符串 以 $ 符号开头,后跟字符串长度
  • 整数值 以 : 符号开头,后跟整数的字符串形式
  • 错误消息 以 - 符号开头
  • 数组 以 * 号开头,后跟数组的长度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值