摘要: 对象 Redis并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型。 typedef struct redisObject { // 类型 unsigned type:4; // 编码 阅读全文
posted @ 2023-01-09 19:36 Saturn5 阅读(53) 评论(0) 推荐(0)
摘要: 压缩列表 当一个列表键只包含少量列表项, 并且每个列表项要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表(ziplist)来做列表键的底层实现。 当一个哈希键只包含少量键值对, 并且每个键值对的键和值要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redi 阅读全文
posted @ 2023-01-09 17:38 Saturn5 阅读(36) 评论(0) 推荐(0)
摘要: 整数集合 整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。 虽然 intset 结构将 contents 属性声明为 int8_t 类型的数组, 但实际上 contents 数组并不保存 阅读全文
posted @ 2023-01-09 16:46 Saturn5 阅读(23) 评论(0) 推荐(0)
摘要: 跳表 Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员 ( member ) 是比较长的字符串时,Redis 就会使用跳跃表来作为有序集合键的底层实现。 位于图片最左边的是 zskiplist 结构, 该结构包含以下属性: heade 阅读全文
posted @ 2023-01-09 16:20 Saturn5 阅读(37) 评论(0) 推荐(0)
摘要: 字典 字典是数据库和哈希键的底层实现。 拉链的链表头部插入,以解决冲突。 rehash流程: 为字典的 ht[1] 哈希表分配空间, 这个哈希表的空间大小取决于要执行的操作, 以及 ht[0] 当前包含的键值对数量 (也即是ht[0].used 属性的值): 如果执行的是扩展操作, 那么 ht[1] 阅读全文
posted @ 2023-01-09 15:31 Saturn5 阅读(31) 评论(0) 推荐(0)
摘要: 链表 Redis使用的C没有内置链表结构,Redis自己实现了链表 双端:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)。 无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点。 带表头指针和表尾指针:通过list 阅读全文
posted @ 2023-01-09 13:34 Saturn5 阅读(22) 评论(0) 推荐(0)
摘要: string string是redis最基本的类型,一个key对应一个value。 采用SDS表示字符串,而非C中的简单字符串,SDS本质是结构体,含有free、len、buf三个字段。 SDS长度增长时空间预分配,增长后长度小于1M时,分配的free和len相等,即增长后的buf大小为增长后的le 阅读全文
posted @ 2023-01-09 13:21 Saturn5 阅读(36) 评论(0) 推荐(0)