您的位置:首页 > 数据库 > Redis

[redis]SDS和链表

2020-04-30 19:29 721 查看
# 一、SDS ## 1、SDS结构体 **redis3.2之前**:不管buf的字节数有多少,都用 **4字节的len来储存长度**,对于只存短字符串那么优点**浪费空间**,比如只存 `name`,则`len=4` 则只需要一个字节8位即可表示 ```c struct sdshdr { unsigned int len; // buf中已占字节数 unsigned int free; // buf中剩余字节数 char buf[]; // 数据空间 }; ``` **redis3.2之后:** ```c struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; //已分配字节数 uint8_t alloc; //剩余字节数 unsigned char flags; //标识属于那种类型的SDS 低3存类型,高5不使用 char buf[]; }; //........16、32、64 ``` > \__attribute__ ((\__packed__)) 关键字是为了取消字节对齐 > > ```c > struct test1 { > char c; > int i; > }; > > struct __attribute__ ((__packed__)) test2 { > char c; > int i; > }; > > int main() > { > cout - 删除、插入 O(1) > - 遍历访问 O(n) - **有head和tail指针,将访问最后一个元素复杂度降低到O(1)** - **带有 len长度,方便知道链表的长度** - **双链表结构,前后遍历都方便** - **无环** - **多态:数据用 void* 来指向,可以存放任意类型数据,不用为每个类型都写一个链表** - **迭代器模式**,**链表有一个迭代器,方便遍历节点** ```c typedef struct listIter { listNode *next; //下一个节点 int direction; //遍历方向 forward or backward } listIter; ```
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: