美文网首页
Redis底层数据结构 - SDS动态字符串

Redis底层数据结构 - SDS动态字符串

作者: 沐兮_d64c | 来源:发表于2019-01-09 20:27 被阅读0次

1,SDS简单动态字符串(Simple Dynamic String)

1)sds.h中定义了几种sdshdr的结构体。
typedef char *sds; //定义sds为一个char数组
int len;//已经使用的长度
int alloc;//buf总长度, 不包括头部和\0
char buf[];//sds底层char数组 buf.length - len 等于free的长度

image.png
struct sdshdr {

    // buf 已占用长度
    int len;

    // buf 剩余可用长度
    int free;

    // 实际保存字符串数据的地方
    char buf[];
};

2)创建sds对象
sh = s_malloc(hdrlen+initlen+1);//分配hdrlen + initlen长度,加1(用于存储'\0')
s[initlen] = '\0';//结尾字符串赋值

image.png
image.png
3)SDS扩容
SDS_MAX_PREALLOC : 1024 * 1024字节 = 1MB
当小于1MB的字符串变长时,分配*2的空间;大于1MB的字符串变长时,多分配1MB空间
image.png
4)扩容过程
//set test:sds:append:key hello
struct sdshdr{
  len = 5;
  free = 0;
  buf = "hello\0"
}
//append test:sds:append:key world
struct sdshdr{
  len = 10;
  free = 10;
  buf = "hello world\0             "//共10 + 1 + 10 = 21个字节
}
//append test:sds:append:key hzq
struct sdshdr{
  len = 10;
  free = 10;
  buf = "helloworldhzq\0          "//共10 + 3 + 1 + 7 = 21个字节(不会触发内存重分配)
}

2,SDS特性与使用场景

1)sds实现字符串对象。字符串对象作为value时,保存string则是sds类型,保存long则是long类型
2)redis的键总是 sds类型的字符串对象。
3)sds二进制安全。s[initlen] = '\0'; //创建的时候,不会验证\0字符。存入是什么数据取出来还是什么数据
3)在 Redis 中, 客户端传入服务器的协议内容、 aof 缓存、 返回给客户端的回复, 等等, 这些重要的内容都是由 sds 类型来保存的。

相关文章

  • redis

    redis Redis 数据结构和底层实现string:简单动态字符串SDS,Redis 的字符串是动态字符串,是...

  • Redis底层数据结构

    Redis底层数据结构类型 简单动态字符串(simple dynamic string)SDS Redis 没有直...

  • redis数据结构--SDS

    redis底层存储字符串的数据结构叫做简单动态字符串(simple dynamic string)。 SDS定义 ...

  • Redis字符串与C字符串区别

    一、数据结构 redis的字符串底层数据结构是sds(simple dynamic string),即简单动态字符...

  • redis底层数据结构-SDS

    SDS结构 simple dynamic string(SDS)简单动态字符串是redis string底层的数据...

  • 聊一聊Redis之数据结构

    基本数据结构 简单动态字符串 Redis中的字符串使用“简单动态字符串”(SDS)表示,无论是字符串值还是键底层都...

  • reids的数据类型

    redis的底层数据结构有: sds的简单动态字符串 记录有字符串的长度 字典 基于hashtable实现 压缩列...

  • redis底层数据结构以及对象系统

    底层数据结构 SDS(simple dynamic string,简单动态字符串) SDS空间预分配:对SDS字符...

  • sds

    Sds (Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符串表示, 几...

  • Redis 数据结构之SDS

    Redis 数据结构之SDS 简单动态字符串 为了实现对于字符串的高效操作,Redis 自己构建的一种名为简单动态...

网友评论

      本文标题:Redis底层数据结构 - SDS动态字符串

      本文链接:https://www.haomeiwen.com/subject/sspbrqtx.html