美文网首页
redis 内部数据结构(1.1)-字符串

redis 内部数据结构(1.1)-字符串

作者: 颜灏_2181 | 来源:发表于2017-03-24 11:15 被阅读0次

简单动态字符串 sds

数据结构

typedef char *sds;

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

与 C 中字符串结构不同的是,C语言需要遍历字符串以确认字符串结束的位置(On),SDS 的效率是 O1.

SDS 的好处不止于此,还可以避免在修改 buf,尤其是追加情况下, 的内存溢出问题。

内存分配

直接引用别人博客里说的内容吧。

1. 在函数sdsnewlen中,根据是否需要初始化使用zmalloc和zcalloc两个不同函数。
2. 计算字符串长度的时候,直接使用函数sdslen,不需要调用strlen。
3. 需要扩展free的空间时, 需要调用函数sdsMakeRoomFor, 该函数空间分配策略比较有意思, 如果free>=addlen,直接返回。 否则判断free+addlen是否小于SDS_MAX_PREALLOC这个宏, 如果小于,那么这次就分配2*(free+addlen)的空间, 这样每次多分配一陪的空间; 否则就分配free+addlen+SDS_MAX_PREALLOC的空间。 这样可以控制最大多分配多少的空间, 以至于不要浪费太多空间。例如: sds old=sdsnew("test one"); sds new=sdscat(old,"test"); 此时有12的空余空间, 如果再次调用``sdscat(new,”test”)``, 那么就不需要分配空间。
4. 在函数sdscatvprintf中, 空间申请是以16,32,64..这样增长的, 无处不透露提高性能。
5. 在函数sdscmp中, 调用memcmp, 性能要比strcmp好, 而且还是二进制安全的。
6. 在函数sdssplitlen中, 默认分配的数组为5, 然后按照2的倍数进行增长, 这样做法,有点浪费空间,但是加快速度,不要每分割出来一个字符串就要申请空间。 比较的时候把seplen为1分出来, 也是加快字符串比较速度的考虑, 大部分时候应该是seplen为1。

增加的情况

为什么需要用 free,为什么需要预先分配内存空间?
其实目的很明确,就是避免过多次的分配内存空间,因为这个过程时间消耗很大。如果需要修改字符串,检查 free 是否够用,如果够则不分配内存,否则分配。达到减少内存变动次数的目的。

预分配空间的大小是这样决定的:

1 length >> 20 > 1,length 对于的大小超过 1M,分配 1M 的free
2 length >> 20 <=1, 分配与 length 相同大小的 free

减少的情况-惰性空间释放

用几个图来说明释放时候 free 的变化情况:

初始状态 释放全部 x,y 的状态图 释放后追加的状态

其他

SDS 是二进制安全的,比 C 只能保存文本数据相比具有更多的优势。可以兼容部分 C 语言中的字符串函数。

相关文章

  • Redis 总结

    [TOC] 一、Redis 基础常问 1.1、Redis 有哪些数据结构 基础:字符串String、字典Hash、...

  • redis 内部数据结构(1.1)-字符串

    简单动态字符串 sds 数据结构 与 C 中字符串结构不同的是,C语言需要遍历字符串以确认字符串结束的位置(On)...

  • Redis(01)-数据结构

    Redis 支持的五种存储数据的类型 字符串(String)类型 字符串是Redis支持的最简单的数据结构,内部就...

  • Redis基础知识

    1.Redis核心数据结构 1.1 String 字符串常用操作SET key value ...

  • 最全的 Redis 数据类型解析!

    1. String(字符串) 1.1 简单介绍 字符串类型是Redis最基础的数据结构,字符串类型可以是JSON、...

  • redis学习

    [toc] redis 数据结构 字符串 setnx可以作为分布式锁的实现方法; 内部编码 哈希表 内部编码 zi...

  • redis基础

    1.数据结构 1.1 结构类型简介 首先对redis来说,所有的key(键)都是字符串。我们在谈基础数据结构时,讨...

  • 01-redis数据结构与对象

    3. redis数据结构与对象 redis对外支持数据结构 字符串 (string) 字符串列表(list) 字符...

  • redis 学习整理

    本文是《redis设计与实现》的学习整理。 1 基础数据结构 1.1 字符串 1.2 链表 1.3 哈希表 1.4...

  • Redis字符串数据结构和常用命令

    字符串是 Redis 最基本的数据结构,它将以一个键和一个值存储于 Redis 内部,它犹如 Java 的 Map...

网友评论

      本文标题:redis 内部数据结构(1.1)-字符串

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