Redis源码剖析——SDS的实现

Redis中的SDS(简单动态字符串)是基础数据结构之一,具有高效的长度获取和内存管理。本文详细介绍了SDS的结构,包括sdshdr结构体、基本操作函数如sdsnewlen、sdslen、sdsavail等,并探讨了其内存扩展策略。
摘要由CSDN通过智能技术生成

SDS的实现


SDS即简单动态字符串,为Redis的几大基本数据结构之一,有广泛的用途

基本函数总览

函数 功能 复杂度
sdsnewlen 由给定字符串创建SDS O(N)
sdslen 返回字符串长度 O(1)
sdsdup 复制一个SDS O(N)
sdsfree 释放字符串空间 O(1)
sdsavail 获取空闲空间大小 O(1)
sdsMakeRoomFor 扩展SDS buf空间 O(N)
sdsgrowzero 扩展字符串到指定长度,多的用0填充 O(N)
sdscatlen 拼接字符串到已有字符串末尾 O(N)
sdscpylen 将字符串拷贝到现有SDS处 O(N)

sdshdr结构体

/*
 * 类型别名,用于指向 sdshdr 的 buf 属性
 */
typedef char *sds;

/*
 * 保存字符串对象的结构,显然32位下 sizeof(sdshdr) = 8
 */
struct sdshdr {    
    // buf 中已占用空间的长度
    int len;
    // buf 中剩余可用空间的长度
    int free;
    // 数据空间
    char buf[];
};

sds的结构如图

这里写图片描述

sdsnewlen

/* 
 * 创建init指向的长度为 initlen 的字符串
 */
sds sdsnewlen(const void *init, size_t initlen) {

    struct sdshdr *sh;

    // 根据是否有初始化内容,选择适当的内存分配方式
    // T = O(N)
    if (init) {
        // zmalloc 不初始化所分配的内存
        sh = zmalloc(sizeof(struct sdshdr)+initlen+1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值