Redis笔记(1)数据结构与对象】的更多相关文章

1.前言 此系列博客记录redis设计与实现一书的笔记,提取书本中的知识点,省略相关说明,方便查阅. 2.基本数据结构 2.1 简单动态字符串SDS(simple dynamic string) 结构体定义: len:  buf数组中已使用字节的数量,使用len判断实际内容长度,而不是'\0'字符 free: 未使用字节的数量,查询该值,杜绝内存溢出 buf[]: 实际分配空间及存储内容(字节数组,保证二进制安全,怎么存怎么取) 保留C语言的习惯,字符串以'\0'结束,好处在于可以兼容使用C的A…
目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对象这个基本单位的,并且往往一个对象下面对对应不同的底层数据结构实现以便于在不同的场景下切换底层实现提升效率.例如列表对象在元素不多情况话会使用压缩列表来实现以压缩内存,而在元素比较多的时候常规的双端链表进行实现. 下面我们就具体来看看 redis 中都有哪些对象,底层又对应哪些可供选择的数据结构.…
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name(key)和liushijie(key)就存储在SDS中. SDS数据结构如下: struct sdshdr { // 所保存字符串的长度 int len; // 未使用字节长度 int free; // 字节数组,保存字符串 char buf[]; }; SDS遵循C字符串以'\0'空字符串结尾的惯例,所…
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis的键值对中,键必然是用字符串对象实现的,所以我们一般说的列表键,指的是字符串键+列表值. - 但是redis并没用这些数据结构直接实现redis的键值数据库,而是基于这些数据结构有一个对象系统,这个系统包括:字符串对象,列表对象,哈希对象,集合对象和有序集合对象,每一种对象都可能用到一到多种基本的数…
前言 本书是Redis设计与实现的读书笔记,旨在对Redis底层的数据结构及实现有一定了解.本书所有的代码基于Redis 3.0. 简单动态字符串 SDS Redis没有直接使用C语言中的字符串,而是自己构建了一种叫简单动态字符串(Simple Dynamic String,SDS)的类型. 使用SDS而不是C字符串的优势 获取字符串长度的复杂度降低:直接根据len属性,复杂度为O(1),C字符串需要遍历字符串,复杂度O(N). 杜绝缓冲区溢出:SDS会在修改时,先检查缓冲区的大小,不足时,先扩…
目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表与哈希节点 3.2 字典 3.3 哈希算法 3.4 解决键冲突 3.5 rehash 3.6 渐进式rehash 3.7 字典的API 最后 前言 参考资料:<Redis设计与实现 第二版>: 本篇笔记按照书里的脉络,将知识点分为四个部分.其中第一部分数据结构与对象分为上中下篇,上篇包括:SDS.…
目录 前言 1. Redis对象概述 1.1 对象的定义 2. 字符串对象 3. 列表对象 3.1 quicklist 快速链表 4. 哈希对象 5. 集合对象 6. 有序集合对象 7. Redis对象的特点 7.1 类型检查与命令多态 7.2 内存回收 7.3 对象共享 7.4 对象的空转时长 最后 前言 参考资料:<Redis设计与实现 第二版>: 本篇笔记按照书里的脉络,将知识点分为四个部分.其中第一部分数据结构与对象分为上中下篇,上篇包括:SDS.链表和字典:中篇包括跳跃表.整数集合和…
目录 前言 1. 跳跃表 1.1 跳跃表与其节点的定义 1.2 跳跃表的API 2. 整数集合 2.1 整数集合的实现 2.2 整数集合的类型升级 2.3 整数集合的API 3. 压缩列表 3.1 压缩列表的结构 3.2 压缩列表节点的定义 3.3 连锁更新 3.4 压缩列表的API 最后 前言 参考资料:<Redis设计与实现 第二版>: 本篇笔记按照书里的脉络,将知识点分为四个部分.其中第一部分数据结构与对象分为上中下篇,上篇包括:SDS.链表和字典:中篇包括跳跃表.整数集合和压缩列表:下…
Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象.列表对象.哈希对象.集合对象和有序结合对象共5种类型的对象.   1 简单动态字符串 redis自定义了简单动态字符串数据结构(sds),并将其作为默认字符串表示. struct sdshdr { unsigned int len; unsigned int free; char bu…
对象 Redis并没有使用之前介绍的数据结构来实现键值对数据库,而是基于那些数据结构创建了一个对象系统,这个系统包含字符串对象.列表对象.哈希对象.集合对象和有序集合对象这五种类型对象, 每种对象都用到了至少一种我们前面所介绍的数据结构. 1. Redis数据库中的每个键值对的键和值都是一个对象. 2. Redis共有字符串.列表.哈希.集合.有序集合五种类型的对象,每种类型的对象至少都有两种或者以上的编码方式,不同的编码可以在不同的使用场景上优化对象的使用效率. 3. 服务器在执行某些命令之前…