Redis底层探秘(三):字典】的更多相关文章

字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构. 字典经常作为一种数据结构内置在很多高级编程语言里面,但redis所使用的C语言并没有内置这种数据结构,因此Redis构建了自己的字典实现. 字典在redis中的应用相当广泛,比如redis的数据库就是使用字典来作为底层实现的,对数据库的增.删.查.改操作也是构建在对字典的操作之上的. 除了用来实现数据库之外,字典还是哈希键的底层实现之一,当一个哈希…
前面几篇文章,我们一起学习了redis用到的所有主要数据结构,比如简单动态字符串(sds).双端链表.字典.压缩列表.整数集合等等. redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象.列表对象.哈希对象.集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构. 通过这五种这五种不同类型的对象,redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令.使用对象的另一个好处…
链表简介 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地跳转链表的长度. 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现. 链表在Redis中的应用非常多,比如列表键的底层实现之一就是链表,发布与订阅.慢查询.监视器等功能也用到了链表,Redis服务器本身还是用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区(output buffer). 链表和链…
整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含 整数值元素,并且这个集合的元素数量不多时,Redis就会使用郑书记和作为集合键的底层实现. 整数集合的实现 整数集合是redis用于保存整数值的集合抽象数据结构,它可以可以保存类型位int16_t.int32_t.int64_t的整数值,并且保证集合中不会出现重复元素. intset.h/intset结构表示一个整数集合 typedef struct intset { uint32_t encoding;//编码方式 u…
redis是我们使用非常多的一种缓存技术,他的性能极高,读的速度是110000次/s,写的速度是81000次/s.这么高的性能背后,到底是怎么样的实现在支撑,这个系列的文章,我们一起去看看. redis的底层数据结构有以下7种,包括简单动态字符串(SDS),链表.字典.跳跃表.整数集合.压缩列表.对象.今天我们一起看下简单动态字符串(simple dynamic string),后面的文章以SDS简称. SDS简介 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符串数组,以下简称…
文章参考 <Redis 设计与实现>黄建宏 字典 在字典中,每个键都是独一无二的,程序可以在字典中根据键查找与之相关联的值,或者通过键来更新和删除值. 字典在 Redis 中的应用相当广泛,比如 Redis 的数据库就是使用字典来作为底层实现的,例如: redis> SET msg "hello world" OK 在数据库中创建一个键为 "msg" 值为 "hello world" 的键值对, 这个键值对就保存在数据库的字典里…
本篇是我们redis系列的最后一篇,整个系列其实是我学习<redis设计与实现>的笔记,这本书感觉不错,推荐使用redis的小伙伴都可以看看. 整个系列的文字都比较干,很多数据结构和C语言的东西,不过只有这么接近底层,我们才能知道redis为什么可以做到这么块. 类型检查与命令多态 redis中用于操作键的命令基本上可以分为两种类型. 其中一种命令可以对任何类型的键执行,比如说del命令.expire命令.rename命令.type命令.object命令等. 而另一种命令只能对特定类型的键执行…
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.redis底层使用了多种数据结构来实现各种特性.对于Redis底层实现的了解,可以让我们对Redis工作原理更加清晰. 那么redis数据结构与内部编码,如下图: redis对象(redisObject) redis源码内部是有一个redisObject对象,redis的键值都是redisObject对象…
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数…
Redis主要数据结构:简单动态字符串(SDS).双端链表.字典.跳跃表.整数集合.压缩列表和快速列表: 一.简单动态字符串(SDS): Redis没有直接使用C语言中的传统的字节数组保存字符串,而是自行构建了简单动态字符串(SDS),C字符串只是作为简单动态字符串(SDS)的字面量,用于在无需对字符串值进行修改的地方. 结构: struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; /* 表示字符串真正的长度,不包含空终止字符*/…
redis底层数据结构 一.简单动态字符串(SDS) 定义: struct sdshdr{ int len;    //SDS所保存的字符串长度 int free //记录buf数组中为使用的字节数量,预留内存长度 char buf[] //字节数组,用于保存字符串 } SDS与C字符串的区别及特点: 1)获取字符串长度: C字符串:遍历整个字符串,直至遇到结束符为止,复杂度为O(n). SDS:在len中记录了本身的长度,所以获取一个SDS长度的复杂度为O(1). 2)杜绝缓存区溢出 C字符串…
redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符串长度简单; 杜绝缓冲区溢出; 减少修改字符串长度时所需的内存重分配次数; 二进制安全;兼容部分C字符串函数; 1.2.链表:使用listNode与list来实现 listNode其属性有 struct listNode *prev:前一个节点,struct listNode *next:后一个节点…
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言所写,所以以下会有c语言的片段,不过都是一些定义,很好理解. Redis底层数据结构有六种: 1.简单动态字符串 2.链表 3.字典 4.跳跃表 5.整数集合 6.压缩列表 7.快速列表 接下来看一下每种数据结构到底是啥? 一.简单动态字符串 (1)Redis默认字符串底层存储结构,比如set k1 v1,键…
5.1 数据库 5.1.1 数据库的结构: Redis 中的每个数据库,都由一个redis.h/redisDb 结构表示: typedef struct redisDb { // 保存着数据库以整数表示的号码 int id; // 保存着数据库中的所有键值对数据 // 这个属性也被称为键空间(key space) dict *dict; // 保存着键的过期信息 dict *expires; // 实现列表阻塞原语,如BLPOP // 在列表类型一章有详细的讨论 dict *blocking_k…
前言     字典在Redis中的应用非常广泛,数据库与哈希对象的底层实现就是字典. 系列文章 图解Redis之数据结构篇--简单动态字符串SDS 图解Redis之数据结构篇--链表 图解Redis之数据结构篇--字典 一.复习散列表 1.1 散列表     散列表(哈希表),其思想主要是基于数组支持按照下标随机访问数据时间复杂度为O(1)的特性.可是说是数组的一种扩展.假设,我们为了方便记录某高校数学专业的所有学生的信息.要求可以按照学号(学号格式为:入学时间+年级+专业+专业内自增序号,如2…
Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simple dynamic string) Redis 使用的简单动态字符串比 c 语言原生的字符串有以下优点: 获取字符串长度的复杂度为O(1) 不存在缓存区溢出 修改字符串长度时,不需要频繁分配内存 空间预分配策略 惰性空间策略 二进制安全 二进制安全的意思是,可以将二进制数据使用 SDS 存储,而不…
第一篇文章,思来想去,写一写Redis吧,最近在深入研究它. 一丶Redis底层结构 1. redis 存储结构 redis的存储结构从外层往内层依次是redisDb.dict.dictht.dictEntry. redis的Db默认情况下有16个,每个redisDb内部包含一个dict的数据结构. redis的dict内部包含dictht的数组,数组个数为2,主要用于hash扩容使用. dictht内部包含dictEntry的数组,可以理解就是hash的桶,然后如果冲突通过挂链法解决 redi…
REDIS  较宽泛的支持5种数据结构  分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了  读者可以自己随意翻阅 很方便 . 接下来介绍的是  这些数据结构背后的实现 .更底层的数据结构实现 (1)先介绍SDS这种数据结构 :SDS[simple dynamic string]简单动态字符串 我们先说场景:比如用的比较多的SET命令  set msg  "hello" 那么过程是什么样子的呢 Redis将在数据库中创…
目录 Redis数据结构-链表与字典的结构 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 Redis字典的使用 Redis数据结构-链表与字典的结构 大家好,我是白泽.今天我们来聊一聊Redis中的链表与字典的结构 链表 关于链表的基础概念其实你在学习Redis之前一定积累了不少,所以本文将默认你已经掌握了链表相关的基础知识,而Redis的链表其实也就是普通的链表~ 因为Redis是使用C语言编写的,因此Redi…
目录 Redis数据结构-链表与字典 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 哈希算法 解决键冲突 rehash 渐进式rehash Redis数据结构-链表与字典 大家好,我是白泽.今天我们来聊一聊Redis中的链表与字典 链表 关于链表的基础概念其实你在学习Redis之前一定积累了不少,所以本文将默认你已经掌握了链表相关的基础知识,而Redis的链表其实也就是普通的链表~ 因为Redis是使用C语言编写…
近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了. 先梳理下redis正常的通讯流程吧 首先服务器启动都有主函数main,这个main函数就在redis.c里 首先是initserverconfig(),在这里初始化了redisserver基本的配置信息, 接着调用loadServerConfig(char *filename) 对 server 全局变量重新初始化. 然后是调用daemonize(),实现守护进程,脱离了控制台,是这个进程 成为独立的首领进程 接下来是ini…
近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了. 先梳理下redis正常的通讯流程吧 首先服务器启动都有主函数main,这个main函数就在redis.c里 首先是initserverconfig(),在这里初始化了redisserver基本的配置信息, 接着调用loadServerConfig(char *filename) 对 server 全局变量重新初始化. 然后是调用daemonize(),实现守护进程,脱离了控制台,是这个进程 成为独立的首领进程 接下来是ini…
说明 用于分析redis底层数据结构以及内存情况 底层数据结构分析 1.查看key键的对象类型type key 本地:>sadd test1 本地:>type test1 set 2.查看key键对应redi对象类型的数据结构 sadd test1 本地:>ct encoding test1 intset 本地:>sadd test1 f 本地:>object encoding test1 hashtable 3.查看对应key值的引用计数(被共享而不是重复创建) 1919a…
Redis底层函数详解 serverCron 函数 它负责管理服务器的资源,并维持服务器的正常运行.在执行 serverCron 函数的过程中会调用相关的子函数,如 trackOperationsPerSecond.SigtermHandler.clientsCron.databasesCron 等函数.默认情况下,每隔 100 毫秒执行一次 serverCron 函数 trackOperationsPerSecond 函数 是 serverCron 函数的一个子函数.采用抽样计算的方式,计算并…
什么是Redis持久化? Redis是键值对的内存数据库,它将数据存储在内存里.客户端发送命令到服务器,再由服务器到内存里查找数据. 一旦Redis服务器进程退出,存储在内存里的数据就会丢失. 为了解决这个问题,Redis提供了持久化机制,即将数据保存到磁盘里,以便Redis服务器进程初始化或重启后重新加载数据,避免数据丢失. Redis提供两种持久化方案,分别是RDB(Redis DataBase)和AOF(Append Only File). RDB持久化 RDB采用快照的方式来实现持久化,…
redis学习教程三<发送订阅.事务.连接>  一:发送订阅      Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redis 发布订阅(pub/sub)实现了消息系统,发送者(在redis术语中称为发布者)在接收者(订阅者)接收消息时发送消息.传送消息的链路称为信道. 示例 以下示例说明了发布用户概念的工作原理. 在以下示例中,一个客户端订阅名为"redisChat"的信道. 1 redis 127.0.0.…
前言 上篇文章Redis闲谈(1):构建知识图谱介绍了redis的基本概念.优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识.互联网的很多应用场景都有着Redis的身影,它能做的事情远远超出了我们的想像.Redis的底层数据结构到底是什么样的呢,为什么它能做这么多的事情?本文将探秘Redis的底层数据结构以及常用的命令. 本文知识脑图如下: 一.Redis的数据模型 用 键值对 name:"小明"来展示Redis的数据模型如下: dictEntry: 在一些编程语言中,键…
今天我们来看一下redis的数据类型.既然redis的键值对可以保存不同类型的值,那么很自然就需要对键值对的类型进行检查以及多态处理.下面我们将对redis所使用的对象系统进行了解,并分别观察字符串.哈希表.列表.集合和有序集类型的底层实现. 3.1 对象处理机制 在redis的命令中,用于对键进行处理的命令占了很大一部分,而对于键所保存的值的类型(键的类型),键能执行的命令又各不相同.如:LPUSH和LLEN只能用于列表键,而SADD和SRANDMEMBER只能用于集合键.又比如DEL.TTL…
字典相对于数组,链表来说,是一种较高层次的数据结构,像我们的汉语字典一样,可以通过拼音或偏旁唯一确定一个汉字,在程序里我们管每一个映射关系叫做一个键值对,很多个键值对放在一起就构成了我们的字典结构. 有很多高级的字典结构实现,例如我们 Java 中的 HashMap 底层实现,根据键的 Hash 值均匀的将键值对分散到数组中,并在遇到哈希冲突时,冲突的键值对通过单向链表串联,并在链表结构超过八个节点裂变成红黑树. 那么 redis 中是怎么实现的呢?我们一起来看一看. 一.字典结构定义 Redi…
1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 结构s d s.h/sdshdr struct sdshdr{ int len; //buf使用的长度 SDS的长度 int free; //buf未使用的长度 char buf[]; //字节数据,保持字符串 } free属性值 0,表示SDS没有分配使用空间 len属性值 5 表示SDS保存了…