redis string 简单动态字符串

简单动态字符串

SDS(simple dynamic string)

结构:
struct sdshdr {
        // 记录buf数组中已使用字节的数量
        // 等于SDS所保存字符串的长度
        int len;

        // 记录buf数组中未使用字节的数量
        int free;

        // 字符数组,用于保存字符串
        char buf[];
    }

结构示例

    特点:
        1.空间预分配

            a.len < 1MB,分配和len属性同样大小的未使用空间,如SDS的len将变成13字节,程序也会分配13字节的未使用空间,buf数组的实际长度变成 13 + 13 + 1 = 27字节(额外的一个字节用于保存空字符)。

            b.len >= 1MB,程序会分配1MB的未使用空间,如SDS的len将变成30MB,将会分配1MB的未使用空间,SDS的buf数组的实际长度为 30MB + 1MB + 1byte。

        2.惰性释放空间

            当SDSAPI需要缩短SDS保存的字符串时,程序并不会立即使用内存重分配来回收缩短后多出来的字节,而是使用free树形将这些字节的数量记录起来,并等待将来使用。

————摘自《redis设计与实现》 黄健宏 著

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1
Dennis_Ritchie

之所以需要这个结构,是因为在程序中需要频繁获取字符串的长度,如果你不存储起来,就需要每次都计算一次,计算的方式很简单,用c表示就是: ··· int i=0; char str="1232423dsfds"; int len=0; while(str[i++]!='\0'){ ++len; } ···

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!