[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;
```
相关文章推荐
- Redis的简单动态字符串SDS、链表
- redis 源代码之数据结构(sds,链表的实现)
- 【Redis源码剖析】 - Redis内置数据结构之字符串sds
- redis源码分析(9)redis源码链表学习总结 adlist.h adlist.c
- redis_3.0.7_sds.c_sdscatlen()
- Redis学习系列 -- SDS结构
- Redis数据结构之sds基本操作函数
- redis源码分析(3)sds
- Redis源码剖析--简单动态字符串sds
- redis string底层数据结构sds
- redis数据结构-双端链表
- Redis设计与实现系列-基本数据结构-链表和压缩列表
- Redis学习——链表实现
- 【Redis源码剖析】 - Redis内置数据结构之双向链表list
- Redis 链表
- Redis链表
- Redis源码分析笔记3-redis的数据类型-链表
- 【Redis缓存机制】5.List链表类型介绍和操作
- redis系列笔记之数据结构SDS
- Redis-数据结构-简单字符串-SDS