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