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 哈希表 ...
随机推荐
- android studio3.1 添加闪屏页面(启动欢迎界面)(例子简单无BUG)
截图 启动页的 activity_splash.xml 我用了一张图片自己添加吧 <?xml version="1.0" encoding="utf-8" ...
- How To Configure NFS Client on CentOS 8 / RHEL 8
https://computingforgeeks.com/configure-nfs-client-on-centos-rhel/
- Docker-harbor-V1.3.0 ”私有仓库“搭建 Easy
准备: centos 7.0 Docker version 1.12.6 docker-compose version 1.19.0 1: updata-yum: 更新yum 源 ...
- Codeforces Round #611 (Div. 3)
原题面:https://codeforces.com/contest/1283 A.Minutes Before the New Year 题目大意:给定时间,问距离零点零分还有多久? 分析:注意一下 ...
- 循环指令 LOOP
循环程序: 如果需要重复执行若干次同样任务.用循环执行 循环指令: LOOP <跳转标号> 用累加器的低字做循环计数器 每次执行LOOP 指令的时候,累加器的低字减去1 若减去后 非零 , ...
- 20170305深圳Meetup Rails中CSS,JS引用关系分析
新手上路,若有错误请及时提醒 Rails中CSS,JS引用关系分析 一.Rails静态文件存放位置 二.Rails中CSS引用方式 三.Rails中JS引用方式与CSS类似 四.上面都是默认引用app ...
- 【转载】Asp .Net Web Api路由路径问题
原文章地址:https://www.cnblogs.com/devtester/p/8897302.html MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一 ...
- 自动填充IP地址
在windows下的DOS窗口中 要利用Netsh命令,进入到DOS下的网络配置状态,就能实现各种网络配置. 进入IP设置模式 在DOS环境中,设置网络参数之前,必须先进入IP设置模式才可以.先打开系 ...
- 面试题(9)之 leetcode-189
题目描述 解法一: /** * @param {number[]} nums * @param {number} k * @return {void} Do not return anything, ...
- Centos 7 x86_64 环境Python2.7升级Python3.7.4
升级Python3.7.4 #安装补丁包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...