The Design and Implementation of Redis

第二章 简单动态字符串

  • simple dynamic string(SDS)

  • O(1)时间获取长度

  • 杜绝了缓存区溢出

  • 空间预分配

    1. SDS 长度小于1MB,就分配同样大小未使用空间

    2. SDS 长度大于1MB,就分配1MB未使用空间

  • 惰性空间释放,不立刻释放未使用内存

  • 二进制安全,读取会和写入完全一样

  • 兼容部分 C 字符串函数,最后以\0结尾

    第三章 Redis 的链表

  • 广泛用于实现 Redis 的各种功能,比如列表键、发布与订阅、慢查询、监视器等

  • 双端

  • 无环,表头的 prev 和表尾的 next 都是 NULL

  • 带表头指针和表尾指针,可从头也可从尾遍历

  • 带长度计数器

  • 多态,用void*来保存节点值,可保存各种类型

    第四章 Redis 的字典

    哈希表的数据结构

    ```c typedef struct dictht { // 哈希表数组 dictEntry ** table;

    // 哈希表大小 unsigned long size;

    // 哈希表大小的掩码,与运算可直接获得索引 // 值是 size-1 unsigned long sizemask;

    // 已有节点数量 unsigned long used; } dictht;

typedef struct dictEntry {

} dictEntry;

typedef struct dict {

} dict;

typedef struct dictType {

} dictType;

typedef struct zskiplistNode {

} zskiplistNode;

typedef struct zskiplist {

};

typedef struct intset {

};

typedef struct redisObject {

} robj;

```

对象

对象type属性的值

TYPE命令的输出

字符串对象

REDIS_STRING

"string"

列表对象

REDIS_LIST

"list"

哈希对象

REDIS_HASH

"hash"

集合对象

REDIS_SET

"set"

有序集合对象

REDIS_ZSET

"zset"

底层实现

类型

编码

对象

REDIS_STRING

REDIS_ENCODING_INT

使用整数值实现的字符串对象

REDIS_STRING

REDIS_ENCODING_EMBSTR

使用embstr编码的简单动态字符串

REDIS_STRING

REDIS_ENCODING_RAW

简单动态字符串

REDIS_LIST

REDIS_ENCODING_ZIPLIST

使用压缩列表实现的列表对象

REDIS_LIST

REDIS_ENCODING_LINKEDLIST

使用双端链表实现的列表对象

REDIS_HASH

REDIS_ENCODING_ZIPLIST

使用压缩列表实现的哈希对象

REDIS_HASH

REDIS_ENCODING_HT

使用字典实现的哈希对象

REDIS_SET

REDIS_INTSET

使用整数集合实现的集合对象

REDIS_SET

REDIS_ENCODING_HT

使用字典实现的集合对象

REDIS_ZSET

REDIS_ENCODING_ZIPLIST

使用压缩列表实现的有序集合对象

REDIS_ZSET

REDIS_ENCODING_SKIPLIST

使用跳跃表和字典实现的有序集合对象

Last updated

Was this helpful?