Redis 底层数据结构之字典】的更多相关文章

文章参考 <Redis 设计与实现>黄建宏 字典 在字典中,每个键都是独一无二的,程序可以在字典中根据键查找与之相关联的值,或者通过键来更新和删除值. 字典在 Redis 中的应用相当广泛,比如 Redis 的数据库就是使用字典来作为底层实现的,例如: redis> SET msg "hello world" OK 在数据库中创建一个键为 "msg" 值为 "hello world" 的键值对, 这个键值对就保存在数据库的字典里…
Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simple dynamic string) Redis 使用的简单动态字符串比 c 语言原生的字符串有以下优点: 获取字符串长度的复杂度为O(1) 不存在缓存区溢出 修改字符串长度时,不需要频繁分配内存 空间预分配策略 惰性空间策略 二进制安全 二进制安全的意思是,可以将二进制数据使用 SDS 存储,而不…
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言所写,所以以下会有c语言的片段,不过都是一些定义,很好理解. Redis底层数据结构有六种: 1.简单动态字符串 2.链表 3.字典 4.跳跃表 5.整数集合 6.压缩列表 7.快速列表 接下来看一下每种数据结构到底是啥? 一.简单动态字符串 (1)Redis默认字符串底层存储结构,比如set k1 v1,键…
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.redis底层使用了多种数据结构来实现各种特性.对于Redis底层实现的了解,可以让我们对Redis工作原理更加清晰. 那么redis数据结构与内部编码,如下图: redis对象(redisObject) redis源码内部是有一个redisObject对象,redis的键值都是redisObject对象…
REDIS  较宽泛的支持5种数据结构  分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了  读者可以自己随意翻阅 很方便 . 接下来介绍的是  这些数据结构背后的实现 .更底层的数据结构实现 (1)先介绍SDS这种数据结构 :SDS[simple dynamic string]简单动态字符串 我们先说场景:比如用的比较多的SET命令  set msg  "hello" 那么过程是什么样子的呢 Redis将在数据库中创…
在上一节提到的图中,我们知道,可以通过 redisObject 对象的 type 和 encoding 属性.可以决定Redis 主要的底层数据结构:SDS.QuickList.ZipList.HashTable.IntSet.ZskipList . 一.简单动态字符串(SDS) 先来看看传统的C 语言如何存储字符串的:比如一个 "Redis" 字符串: 为什么不用传统的 C 语言的方式,因为我们知道数组方式在获取字符串长度或者扩容上存在缺陷:比如获得一个数组长度的复杂度为O(N),…
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保存了…
字典相对于数组,链表来说,是一种较高层次的数据结构,像我们的汉语字典一样,可以通过拼音或偏旁唯一确定一个汉字,在程序里我们管每一个映射关系叫做一个键值对,很多个键值对放在一起就构成了我们的字典结构. 有很多高级的字典结构实现,例如我们 Java 中的 HashMap 底层实现,根据键的 Hash 值均匀的将键值对分散到数组中,并在遇到哈希冲突时,冲突的键值对通过单向链表串联,并在链表结构超过八个节点裂变成红黑树. 那么 redis 中是怎么实现的呢?我们一起来看一看. 一.字典结构定义 Redi…
压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现. 压缩列表是Redis为了节约内存而开发的是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值 z…
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int_16,int_32,int_64的整数值并且保证集合中不会出现重复元素 contents 数组是整数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项,各个项在数组中按值的大小从小到大有序地排列,并且数组中不包括任何重复项 length 属性记录了整数集合包含的元素…
简单动态字符串SDS 包含字符串长度,剩余可用长度,字符数组 用于Redis中所有的string存储 字典(map) 数组+链表形式,跟hashMap很像 链地址法解决hash冲突 rehash使用新建hash数组链表进行数据rehash迁移,扩容是大于原数组长度的第一个2的n次幂 渐进式rehash,就是不是一次性迁移完,而是在CRUD操作时,一点点迁移 用于hash类型数据 链表 双端列表,直接有列表长度属性 用于list类型数据 跳跃表 带分值得一种有序类链表结构 每个节点中的level中…
福哥答案2020-06-13: 福哥口诀法:简链字跳整 压快压 SDS simple synamic string:简单动态字符串.支持自动动态扩容的字节数组 .list :链表 .双端链表.dict :字典.使用双哈希表实现的, 支持平滑扩容的字典 .zskiplist :跳跃表.附加了后向指针的跳跃表 .intset : 整数集合.用于存储整数数值集合的自有结构 .ziplist :压缩列表.一种实现上类似于TLV, 但比TLV复杂的, 用于存储任意数据的有序序列的数据结构 .quickli…
文章参考:<Redis 设计与实现>黄建宏 压缩列表 压缩列表 ziplist 是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串, 那么Redis 就会使用压缩列表当列表键的底层实现. 例如: redis> RPUSH lst 1 3 5 10086 "hello" "world" (integer)6 redis> OBJECT ENCODING lst "z…
文章参考 <Redis 设计与实现>黄建宏 Redis(2) 跳跃表 跳跃表 跳跃表 skiplist 是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的,平均复杂度 O(logN).最坏 O(N) Redis 使用跳表作为有序集合集合键的底层实现之一,如果一个有序集合包含的元素数量比较多, 或者有序集合中成员是比较长的字符串时,Redis 就会使用跳表来作为有序集合键的底层实现. 另一个使用跳表的事集群节点中用作内部数据结构. header 指向跳跃…
文章参考:<Redis设计与实现>黄建宏 Redis 的 string 类型底层使用的是 SDS(动态字符串) 实现的, 具体数据结构如下: struct sdshdr { int len; // 记录字符串长度 int free; // 记录 buf 数组中未使用字节的数量 char buf[]; // 保存字符串的字节数组 } 例如: free = 0 代表这个 SDS 没有空闲空间存放字符 len = 5 代表这个 SDS 存放的字符串长度是 5 buf 是一个字符数组,保存了 Redi…
文章参考:<Redis 设计与实现>黄建宏 整数集合 整数集合时集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合数量不多时,就会使用整数集合 typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset; Contents 数组是整数集合的底层实现:每个项在数组中从小到大有序的排列,并且不包含重复项 le…
文章参考:<Redis设计与实现>黄建宏 链表 链表提供了高效的节点重排能力,以及可以顺序访问,也可以通过增删节点灵活调整链表长度,Redis中的列表.发布订阅.慢查询.监视器等功能均用到了链表. 链表和链表节点的实现 链表节点的定义 typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; }listNode; 多个 listNode…
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支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集合(Zset),我们在日常工作中也会经常使用它们.知其然,更要知其所以然,本文将会带你读懂这五种常见对象类型的底层数据结构. 本文主要内容参考自<Redis设计与实现> 对象类型和编码 Redis使用对象来存储键和值的,在Redis中,每个对象都由redisObject结构表示.redisObject…
1. Redis 底层数据结构 Redis数据库就像是一个哈希表,首先对key进行哈希运算得到哈希值再取模得到一个下标,每个元素是一个节点,节点之间形成链表.这感觉有点像Java中的HashMap. 不同的数据类型的实现方式是不一样的,可以通过object encoding命令查看底层真正的数据存储结构 同一种类型在不同的条件下所采用的数据结构也不一样,例如: Redis是键值对形式的数据库,key可以是任意值(PS:最终都会转成string),value有多种数据类型 详见:https://r…
简介 redis[1]是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).通常我们并不需要理解其底层数据结构,但如果能了解一下相关知识将会有助于我们更有效地使用Redis,并能够将这些知识应用到我们的工作中. Redis内部实现如下数据结构[2,3,4,10]: 1 String 2 Hash Table 3 Doubly…
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-value数据库. 在<Redis设计与实现>这样描述: Redis 数据库里面的每个键值对(key-value) 都是由对象(object)组成的: 数据库键总是一个字符串对象(string object); 数据库的值则可以是字符串对象.列表对象(list).哈希对象(hash).集合对象(set).…
说明 用于分析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吧,最近在深入研究它. 一丶Redis底层结构 1. redis 存储结构 redis的存储结构从外层往内层依次是redisDb.dict.dictht.dictEntry. redis的Db默认情况下有16个,每个redisDb内部包含一个dict的数据结构. redis的dict内部包含dictht的数组,数组个数为2,主要用于hash扩容使用. dictht内部包含dictEntry的数组,可以理解就是hash的桶,然后如果冲突通过挂链法解决 redi…
Redis 简介 REmote DIctionary Server(Redis) 是一个由SalvatoreSanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 它通常被称为数据结构服务器,因为值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型.…
一.概述 接着上篇继续,这篇把数据结构之字典学习完, 这篇知识点包括:哈希算法,解决键冲突, rehash , 渐进式rehash,字典API. 1.1 哈希算法 当一个新的键值对 需要添加到字典里面时,程序需要先根据“键值对”的键计算出哈希值和索引值,再根据索引值,将包含新“键值对”的哈希表节点放到哈希表数组的指定索引上面.redis计算哈希值和索引值的方法如下: #使用字典设置的哈希函数,计算键key的哈希值 hash = dict -> type->hashFunction(key);…
一. 概述 字典又称符号表(symbol table),关联数组(associative array), 映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构.在字典中,一个key和一个value进行关联称为键值对.在字典中每个键都是唯一的,程序可以在字典中根据键查找关联的值,或通过键更新删除值等操作.在C语言中并没有内置这种数据结构,因此Redis构建了自己的字典实现.在Redis中应用广泛, 对数据库的增,删,查,改 都是构建在对字典的操作之上的. -- 例1…
上一篇博客我们介绍了 redis的五大数据类型详细用法,但是在 Redis 中,这几种数据类型底层是由什么数据结构构造的呢?本篇博客我们就来详细介绍Redis中五大数据类型的底层实现. 1.演示数据类型的实现 上篇博客我们在介绍 key 相关命令的时候,介绍了如下命令: OBJECT ENCODING key 该命令是用来显示那五大数据类型的底层数据结构. 比如对于 string 数据类型: 我们可以看到实现string数据类型的数据结构有 embstr 以及 int. 再比如 list 数据类…
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数…
字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构. 字典经常作为一种数据结构内置在很多高级编程语言里面,但redis所使用的C语言并没有内置这种数据结构,因此Redis构建了自己的字典实现. 字典在redis中的应用相当广泛,比如redis的数据库就是使用字典来作为底层实现的,对数据库的增.删.查.改操作也是构建在对字典的操作之上的. 除了用来实现数据库之外,字典还是哈希键的底层实现之一,当一个哈希…