Redis——SDS学习

1、什么是SDS

SDS全称为Simple Dynamic String,即简单动态字符串,是redis的基本数据结构之一,用于存储字符的整型数据。SDS兼容C语言标准字符串处理函数,并且保证了二进制安全。

二进制安全:在C语言中,"\0"表示字符串结束,那么如果字符串中本身带有"\0",字符串就会被阶段,即非二进制安全;如果通过某种机制保证读写字符串的完整性,则是二进制安全

2、redis3.2之前SDS的结构如下:

struct sds {
    int len;//buf中已占用字节数
    int free;//buf中剩余可用字节数
    char buf[];//数据空间
};
SDS的结构具有以下优点:
1. 有单独统计变量的len和fee,可以很方便的得到字符串的长度
2. 字符串的内容存放在buf数组中,可像读取C语言字符串语言读取SDS的内容,兼容C语言处理字符串的各种函数
3. 由于有len的存在,读写字符串不依赖"\0"终止符,保证二进制安全
3、SDS的改进

SDS的头(len+free)占用了8个字节。在实际应用中,存放redis的字符串往往并没有那么长,对于短字符串,SDS的头的内存开销显得十分昂贵,于是对内存优化极其变态(褒义)的redis团队对SDS做了以下改动:

  1. 在sds原有的结构中增加一个flags标识,分别用来标识五种类型(长度1字节,2字节,4字节,8字节以及小于1字节)
  2. 设计了5种SDS结构体,分别用于存储这五种类型
4、SDS结构体
  1. 在五种类型的结构体中,用于存储小于32位的短字符串的SDS结构体比较特殊:由于标识5种类型,所占一个字节的flags还有5位是空闲的,所以被用来存储buf数组的长度(redis开发团队是有多抠,一点内存都不放过)。由于短字符串的优化力度极大,所以使用redis时尽可能的不要存储大对象
//存储长度为32位以下的短字符串结构
sdshdr5{
    unsigned char flags; //低三位存储类型,高五位存储长度
    char buf[]; //柔性数组,存放实际内容
}
  1. 大于31位的字符串flags就无能为力了,所以在以下四种结构中,flags的第三位用来标识类型,高五位暂时预留了,按照之前的思路,len表示已用长度,alloc为总长度
sdshdr8{
    uint8_t len;//1字节存储
    uint8_t alloc;//1字节存储
    unsigned char flags;
    char buf[];
};
sdshdr16{
    uint16_t len; //2字节存储
    uint16_t alloc;//2字节存储
    unsigned char flags;
    char buf[];
};
sdshdr32{
    uint32_t len; //4字节存储
    uint32_t alloc; //4字节存储
    unsigned char flags;
    char buf[];
};
sdshdr64{
    uint64_t len; //8字节存储
    uint64_t alloc; //8字节存储
    unsigned char flags;
    char buf[];
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值