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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 1
Dennis_Ritchie

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

3年前 评论

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