概述
1.SDS介绍
2.SDS API
3.SDS与C的比较
SDS介绍
在C语言中,用来表达字符串的方式通常有两种,
char *buf1="redis";
char buf2[]="redis";
方式1,通过一个char指针指向一个字符串字面量,起内容无法改变,即无法通过buf1[1]='c'来改变内容,如果需要改变,需要将指针重新赋值,指向其他内存空间;
方式2,char数组,末尾有一个‘ ’来代表结束,但是不携带长度信息,在字符串操作时,比如strcat,可能会导致缓存区溢出。
在Redis里面C中的字符串字面量一般只用于不需要对字符串值修改的地方,比如打印日志:
redisLog(REDIS_WARNING,'redis now is ready to exit,bye bye...')
当需要对字符串值进行修改时,会使用SDS结构来表示字符串值;
在Redis中,SDS用于很多地方,比如数据库中的键值,缓冲区,AOF缓冲区等。 可以说SDS是redis的基础。
可以看一下SDS的数据结构,在sds.h文件:
struct sdshdr { unsigned int len; //记录buf数组中已经使用的字节数量,等于SDS的长度 unsigned int free; //buf数组中未使用的字节数量 char buf[]; //buf数组,用于存储字符串 };
可以看到,sds的数据结构多了len和free字段,后面会讲到这两个字段的主要用途。下图说明存储结构:
SDS API
创建
sds sdsnewlen(const void *init, size_t initlen) { struct sdshdr *sh; if (init) { sh = zmalloc(sizeof(struct sdshdr)+initlen+1); //初始化,+1用于存储" " } else { sh = zcalloc(sizeof(struct sdshdr)+initlen+1); } if (sh == NULL) return NULL; sh->len = initlen; //设置长度 sh->free = 0; //free为0 if (initlen && init) memcpy(sh->buf, init, initlen); //将init中的内存拷贝到sds中 sh->buf[initlen] = '