简单动态字符串SDS
1.数据结构
struct sdshdr {
//记录buf数组中的已使用字节
//等于SDS所保存字符串的长度
int len;
//记录buf中未使用字节的数量
int free;
//字节数组,用于保存字符串
char buf[];
}
2.SDS与C字符串的区别
链表
- 常数复杂度获取字符串长度
- 通过len变量获取,不用每次调用strlen函数和,strlen函数复杂度为O(n)
- 杜绝缓存区溢出
- SDS中buf变量修改时,先检查SDS空间是否满足修改所需的要求,如果不满足,会自动将SDS的空间扩展至所需的大小。然后在执行修改
- 减少修改字符串时带来的内存重分配次数
由于内存重分配涉及复杂的算法,并且可能需要执行系统调用,所以通常是一个比较耗时的操作。redis作为数据库,经常被用于速度要求严苛、数据被频繁修改的场合,如果这种修改频繁地发生的话,可能还会对性能造成影响。
- 空间预分配
- 惰性空间释放
- 二进制安全
- 兼容部分C字符串函数
1.数据结构
typedef struct listNode {
struct listNode *prev;//前置节点
struct listNode *next;//后置节点
void *value; //节点的值
} listNode;
typedef struct list {
listNode *head; //表头节点
listNode *tail; //表尾节点
unsigned long len; //包含的节点数量
void *(*dup)(void *ptr);//节点值复制函数
void (*free)(void *ptr);//节点值释放函数
int (*match)(void *ptr, void *key);//节点对比函数
} list;
来源:https://blog.csdn.net/NLSQQ/article/details/99320864