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 哈希表 ...
随机推荐
- poj 1854 Evil Straw Warts Live 变成回文要几次
Evil Straw Warts Live Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1799 Accepted: ...
- JuJu团队11月26号工作汇报
JuJu团队11月26号工作汇报 JuJu Scrum 团队成员 今日工作 剩余任务 困难 于达 对原始文本进行预处理, 并转换成可被julia读入的格式 完成预处理并用julia读入. 读入后按 ...
- P1052 卖个萌
P1052 卖个萌 转跳点:
- pt-query-digest使用详解
1.语法及重要选项pt-query-digest [OPTIONS] [FILES] [DSN] --create-review-table 当使用--review参数把分析结果输出到表中时,如果没有 ...
- 计算机操作系统学习(一) Linux常用指令(随时更新)
1.chmod 以下转载至https://blog.csdn.net/summer_sy/article/details/70142475 chmod u+x file.sh 就表示对当前目录下的fi ...
- JavaScript中的面向对象及有关应用
面向对象(OOP:Object Oriented Programming) 面向对象的概念 面向对象是一种程序设计思想,将数据和处理数据的程序封装到对象中. 特性:抽象.继承.封装.多态. 优点:提 ...
- 一百零九、SAP的OO-ALV之三,屏幕绘制器的使用
一.在Screen页面,点击格式,会打开屏幕绘制器 二.点击定制控制,和PS一样画出一个显示区域的画布容器 三.双击之后,在弹出的属性页面写入一个名字,保存 四.激活屏幕后关闭 五.关闭屏幕绘制器之后 ...
- 166-PHP 文本分割函数str_split(一)
<?php $str='programming'; //定义一个字符串 $arr=str_split($str); //将字符串分割并传入数组 print_r($arr); //输出数组详细信息 ...
- Apache NiFi Processor实战
1 前言 Apache NiFi是什么?NiFi官网给出如下解释:“一个易用.强大.可靠的数据处理与分发系统”.通俗的来说,即Apache NiFi 是一个易于使用.功能强大而且可靠的数据处理和分发系 ...
- 第十二篇视图层之视图函数(views)-三件套
视图层之视图函数(views) 阅读目录(Content) 视图层之视图函数(views) 一个简单的视图 HttpRequest HttpResponse redirect 函数 对比render与 ...