redis中的sds结构解析,字符串为何不用C原生?

redis中的sds结构解析

0丶源码基于redis 6.2.7

1丶什么是sds

sds 即: simple dynamic string,简单动态字符串

2丶redis为什么使用sds,不适用c语言的字符串呢?

1丶sds可以在O(1)的时间范围中获取字符串长度,c语言需要遍历
2丶sds拥有自动扩容机制.
3丶sds拥有惰性空间释放机制,减少了内存分配次数.
4丶sds是二进制安全的.

3丶从源码探究

3.1 ,下载源码

Download | Redis

3.2. 查看源码

打开sds.h

/*
 *  sdshdr5从未被使用过,只是访问flag标识;
 *  flag 低三位 存储类型;  高5位 存储数据长度.  2^5=32.  因为buf最后以/0结尾. 故最大长度为31.
 * typedef unsigned char     uint8_t;
   typedef unsigned short    uint16_t;
   typedef unsigned int      uint32_t;
   typedef unsigned __int64     uint64_t;
 * */
struct __attribute__ ((__packed__)) sdshdr5 {
    unsigned char flags; /*flag 低三位 存储类型;  高5位 存储数据长度.  2^5=32.  . 故最大长度为31.*/
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len; /* 已使用的数据长度 */
    uint8_t alloc; /* 总长度  */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
    uint16_t len; /* used */
    uint16_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
    uint32_t len; /* used */
    uint32_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
    uint64_t len; /* used */
    uint64_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

短字符串,长度小于32时,使用的数据结构sdshdr5,结构如下.

redis中的sds结构解析,字符串为何不用C原生?_第1张图片

相比redis3.0.0结构:
redis中的sds结构解析,字符串为何不用C原生?_第2张图片

struct sdshdr {
  

你可能感兴趣的:(redis,redis,数据库,nosql)