Redis的数据结构和对象。
一、简单动态字符串(simple dynamic string--SDS)
Redis使用SDS表示字符串值,键值对都用SDS实现。SDS中的字符数组buf以空字符串结尾,好处是可以直接重用一部分C字符串函数库。s

SDS的一个例子
SDS的优势:
1、常数复杂度获取字符串的长度,确保获取长度不会成为Redis的性能瓶颈。
2、杜绝缓冲区溢出,SDS的空间分配策略会在执行修改之前,检查SDS的空间是否满足修改的需求,所不满足则自动拓展SDS空间。
3、减少每次修改字符串时需要的内存重分配次数。
SDS通过未使用空间,实现了空间预分配和惰性空间释放两种优化策略。
(1)空间预分配:若修改后SDS长度小于1MB,则分配和len属性值大小相同的未使用空间,则buf数组的实际长度为:len+len+1;若修改后SDS长度大于等 于1MB,那么程序分配1MB,buf数组实际长度为:len+1MB+1byte;
SDS API先检查空间是否足够,若足够直接使用free空间,不需要内存重分配。
(2)惰性空间释放:缩短字符串时,不需要释放内存,使用free将需要释放的字节数记录下来作为未使用空间,等待将来使用。
4、二进制安全。
C字符串中不能含空字符串,否则会被认为是字符串结尾,这使得C字符串只能保存文本数据,不能保存图片等二进制数据。SDS的API是二进制安全的,不 会对数据做限制。SDS使用len的值而不是空字符判断字符串是否结束。
5、部分兼容C字符串函数。
二、链表
Redis构建了自己的链表实现。 多态性:dup,free,match三个函数的使用。链表被广泛用于Redis各种功能,如列表键,发布和订阅,慢查询,监视器等。

三、字典
Redis构建了自己的字典实现。对数据库的增,删,改,减也是构建在对字典的操作之上,哈希键。
Redis的字典使用哈希表作为底层实现,一个哈希表由多个哈希表节点,每个哈希表节点保存了字典的一个键值对。
3.1 哈希表(struct dictht{...})

3.2 字典(struct dict{...})
type指向dictType结构,包含了一组操作特定类型键值对的函数。
privdata包含了传给那些特定函数的可选参数。
ht属性包含两个dictht哈希表,一般只使用ht[0],ht[1]只会在对ht[0]哈希表进行rehash时使用。
rehashidx 记录rehash目前的进度。

3.3 哈希算法
Redis的数据结构和对象。的更多相关文章
- Redis 基础数据结构与对象
Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包 ...
- redis所有数据结构及对象------redis设计与实现
建议点开原图看
- redis 基础数据结构实现
参考文献 redis数据结构分析 Skip List(跳跃表)原理详解 redis 源码分析之内存布局 Redis 基础数据结构与对象 Redis设计与实现-第7章-压缩列表 在redis中构建了自己 ...
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- Redis 的底层数据结构(对象)
目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对 ...
- [redis读书笔记] 第一部分 数据结构与对象 对象类型
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...
- 深入了解Redis【二】对象及数据结构综述
引言 Redis中每个键值对都是由对象组成: 键总是一个字符串对象(string) 值可以是字符串对象(string).列表对象(list).哈希对象(hash).集合对象(set).有序集合对象(z ...
- Redis数据结构和对象三
1.Redis 对象系统 Redis用到的所有主要数据结构,简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合.跳跃表. Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些 ...
- Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》
目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...
随机推荐
- cf 763A. Timofey and a tree
呵呵呵,直接判断是不是一个点连起来所有的特殊边(连接2不同颜色的点的边) (一开始还想各种各样奇怪的dfs...垃圾) #include<bits/stdc++.h> #define LL ...
- 解决对路径bin\roslyn..的访问被拒绝
使用visual studio开发,一重新编译就会报错: 对路径“bin\roslyn\System.Reflection.Metadata.dll”的访问被拒绝 一开始的解决办法就是把bin下的文件 ...
- NASA的10条编码规则
关于NASA的10条编程规则,他们曾表示:这些规则的作用就像汽车上的安全带:最初,它们可能有点不舒服,但过了一会儿,它们的使用就变成了第二天性,而没有使用它们就变得不可想象. Gerard J. Ho ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-volume-down
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 【转载】WebDriver拾级而上·之零 WebDriver理论
Selenium2.0 = Selenium1.0 + WebDriver(也就是说Selenium2.0合并了这两个项目) Selenium1.0可以使用任何编程语言,但是有个先决条件就是必须支 ...
- 在Mac上如何运行jar文件
操作一:编译,打包. 操作二: 运行jar文件,提示:jar中没有主清单属性. 解决办法: 使用解压工具解压HelloWorld.jar文件,往MANIFEST.MF中添加Main-Class. 1. ...
- <老古董>1962年的线性支持向量机解法
我们说“训练”支持向量机模型,其实就是确定"最大间隔超平面". 用数学语言来说就是确定一个最优的W.好比训练一个逻辑回归模型的目的是确定最优的W和b. 输入 X,为一个n维向量 输 ...
- 堆栈 pop push
1.什么是堆栈 1.1堆栈 堆栈可以看作程序的心脏 所有重要的数据都会在这个里面体现(比如运算一道算术题,虽然还没算出最终答案,但是你在算出最终结果前的一些过程值可以放进堆栈) 堆栈这块内存比较特殊, ...
- Python Learning Day8
bp4解析库 pip3 install beautifulsoup4 # 安装bs4pip3 install lxml # 下载lxml解析器 html_doc = """ ...
- 《新标准C++程序设计》1.1-1.6(C++学习笔记1)
1.cout输出 cout<<待输出项<<待输出项2<<···; 2.cin输入 cin>>变量1>>变量2>>···; 3.C ...