Redis设计与实现 读书笔记
文章平均质量分 82
个人笔记
Loritas-
日积月累,滴水成海
展开
-
Redis-7. 对象
对象对象对象的类型与编码类型编码和底层实现字符串对象编码的转换字符串命令的实现列表对象编码转换列表命令的实现哈希对象编码转换哈希命令的实现集合对象编码的转换集合命令的实现有序集合对象编码的转换有序集合命令的实现类型检查与命令多态类型检查的实现多态命令的实现内存回收对象共享对象的空转时长 对象 Redis没有直接使用SDS等主要的数据结构来实现数据库,而是根据这些数据结构构建了一个对象系统 这个系统包含5种不同类型的对象: 字符串对象 列表对象 哈希对象 集合对象 有序集合对象 Redis可以在执行命令前原创 2022-05-27 13:09:39 · 270 阅读 · 0 评论 -
Redis-6. 压缩列表
Redis/压缩列表压缩列表压缩列表的构成压缩列表节点的构成previous_entry_lengthencodingcontent连锁更新压缩列表API 压缩列表 压缩列表(ziplist)是列表键和哈希键的底层实现之一。 当一个列表键只包含少量列表项,且每个列表项是小整数值或者长度较短的字符串时,Redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键值对,且每个键值对的键和值是小整数值或者长度较短的字符串时,Redis使用压缩列表来做哈希键的底层实现 压缩列表的构成 压缩列表是为了节约原创 2022-05-26 16:46:33 · 177 阅读 · 0 评论 -
Redis-5. 整数集合
Redis/整数集合 升级升级的好处提升灵活性节约内存降级整数集合API 整数集合(intset)是Redis用来保存整数值当集合抽象数据结构,可以保存类型位int16_t、int32_t、int64_t都整数值,且不会出现重复元素 整数集合用intset.h文件内的intset结构表示 typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t conten原创 2022-05-26 00:31:07 · 189 阅读 · 0 评论 -
Redis-4. 跳跃表
Redis/跳跃表跳跃表的实现跳跃表节点层前进指针跨度后退指针分值和成员跳跃表跳跃表API 跳跃表是一种有序数据结构,它通过在每个节点维持多个指向其他节点的指针,从而达到快速访问节点的目的 Redis使用跳跃表作为有序集合键的底层实现之一。 如果一个有序集合包含的元素较多或者有序集合中元素的成员是较长的字符串时,Redis就会使用跳跃表作为有序集合键的底层实现。 Redis只在两个地方使用了跳跃表: 实现有序集合键 集群节点中用作内部数据结构 跳跃表的实现 Redis的跳跃表由redis.h中的zski原创 2022-05-25 22:52:16 · 130 阅读 · 0 评论 -
Redis-3. 字典
Redis/字典字典的实现哈希表哈希表节点字典哈希算法解决键冲突rehash哈希表的扩展与收缩渐进式rehash字典API Redis对字典的使用相当广泛,例如Redis的数据库就是使用字典来作为底层实现的,对数据库的CRUD都是构建在字典的操作之上的。 除此之外,字典也是哈希键的底层实现之一。 当一个哈希键包含的键值对较多,又或者键值对中的元素都是比较长的元素时,Redis就会使用字典作为哈希键的底层实现。 Redis还有很多功能也使用到了字典,字典是Redis里面应用的特别广泛的一个数据结构 字典的实现原创 2022-05-25 19:14:22 · 98 阅读 · 0 评论 -
Redis-2. 链表
Redis/链表链表及其节点的实现 Redis/链表 Redis中链表的应用非常广泛,比如列表键的底层实现之一就是链表。 当一个列表键包含了数量比较多的元素,或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现 为什么列表包含的元素是不够长的字符串时,Redis不使用链表? 这是因为链表需要保存指针变量用来指向其他元素,如果包含的元素是较短的字符串,那么可能在整个链表节点中的空间占比不够高,导致存储密度较低,会有大量空间浪费在存储指针上 Redis中使用到链表的其他功能.原创 2022-05-23 16:53:51 · 83 阅读 · 0 评论 -
Redis-1.简单动态字符串
Redis/简单动态字符串SDS的定义SDS与C字符串的区别常数复杂度获取字符串长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数1.空间预分配2.惰性空间释放二进制安全兼容部分C字符串函数C字符串与SDS的区别 - 小结SDS API小结 Redis/简单动态字符串 Redis内部使用的字符串是自己构建的简单动态字符串(SDS)的抽象类型,C字符串只作为字符串字面量使用 创建KV时,有两种情况: V是字符串对象,则底层实现是 SDS:SDS V是列表,则实现是SDS:SDS,SDS,… SDS的.原创 2022-05-23 00:55:51 · 129 阅读 · 0 评论