- Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist)
- Redis内部数据结构详解(4)——ziplist">Redis内部数据结构详解(4)——ziplist
- 为什么说redis的ziplist节约内存">为什么说redis的ziplist节约内存
- redis 源码学习笔记—ziplist数据结构">redis 源码学习笔记—ziplist数据结构
- redis源码之压缩列表ziplist">redis源码之压缩列表ziplist
- redis数据结构实现—压缩列表(ziplist)">redis数据结构实现—压缩列表(ziplist)
- redis源码中的ziplist zskiplist 压缩表和跳表">redis源码中的ziplist zskiplist 压缩表和跳表
- redis原理总结">redis原理总结
- Redis源码分析(skiplist)">Redis源码分析(skiplist)
- Redis内部数据结构总结(3)ziplist">Redis内部数据结构总结(3)ziplist
- Redis数据结构——intset(整数集合)">Redis数据结构——intset(整数集合)
- Redis内部数据结构详解(7)——intset - zhaoliang83121…_CSDN博客">Redis内部数据结构详解(7)——intset - zhaoliang83121…_CSDN博客
- Redis内部数据结构详解(2)——sds - yellowriver007的…_CSDN博客">Redis内部数据结构详解(2)——sds - yellowriver007的…_CSDN博客
- Redis源码剖析和注释(七)—- 快速列表(quicklist)">Redis源码剖析和注释(七)—- 快速列表(quicklist)
- Redis数据结构——intset(整数集合) - cxc576502021的…_CSDN博客">Redis数据结构——intset(整数集合) - cxc576502021的…_CSDN博客
- …数据结构与对象 skiplist intset ziplist - asmartk…_CSDN博客">…数据结构与对象 skiplist intset ziplist - asmartk…_CSDN博客
- Redis源码剖析—quicklist">Redis源码剖析—quicklist
- Redis源码剖析—快速列表quicklist">Redis源码剖析—快速列表quicklist
- 【redis】ziplist详细解析 - LIncoLN的博客 - CSDN博客">【redis】ziplist详细解析 - LIncoLN的博客 - CSDN博客
- Redis源码学习简记(四)ziplist与zipmap压缩编码原理与…_CSDN博客">Redis源码学习简记(四)ziplist与zipmap压缩编码原理与…_CSDN博客
- Redis源码剖析和注释(六)—- 压缩列表(ziplist)">Redis源码剖析和注释(六)—- 压缩列表(ziplist)
- Redis源码剖析——有序集合对象">Redis源码剖析——有序集合对象
- Redis存储结构 - 菜鸟可以飞的博客 - CSDN博客">Redis存储结构 - 菜鸟可以飞的博客 - CSDN博客
- redis源码解读(一):基础数据结构之SDS - czrzchao的博客 - CSDN博客">redis源码解读(一):基础数据结构之SDS - czrzchao的博客 - CSDN博客
- 【redis】ziplist详细解析">【redis】ziplist详细解析
- Redis哈希对象的ziplist编码实现了O(1)复杂度吗">Redis哈希对象的ziplist编码实现了O(1)复杂度吗
- Redis 源码—省内存大法—intset和ziplist - weixin_33…_CSDN博客">Redis 源码—省内存大法—intset和ziplist - weixin_33…_CSDN博客
- redis源码分析-intset(整型集合)">redis源码分析-intset(整型集合)
- _Redis_2.8和4.0的基本数据结构">_Redis_2.8和4.0的基本数据结构
- Redis源码分析(intset)">Redis源码分析(intset)
- [redis] ziplist-压缩双向链表">[redis] ziplist-压缩双向链表
- redis学习笔记(4)—-跳表zskiplist">redis学习笔记(4)—-跳表zskiplist
- Redis源码学习简记(四)ziplist与zipmap压缩编码原理与个人理解">Redis源码学习简记(四)ziplist与zipmap压缩编码原理与个人理解
- Redis源码剖析——ziplist的实现">Redis源码剖析——ziplist的实现
- redis学习笔记(7)—-压缩字典zipmap">redis学习笔记(7)—-压缩字典zipmap
- redis的压缩列表源码ziplist解析">redis的压缩列表源码ziplist解析
- redis学习笔记(5)—-整数集合intset">redis学习笔记(5)—-整数集合intset
- Redis设计与实现5 集合对象(intset/hashtable) 的介绍">Redis设计与实现5 集合对象(intset/hashtable) 的介绍
- Redis设计与实现2 列表键 (linkedlist/ziplist)的介绍">Redis设计与实现2 列表键 (linkedlist/ziplist)的介绍
- redis学习笔记(6)—-压缩列表ziplist">redis学习笔记(6)—-压缩列表ziplist
- Redis深入浅出——字符串和SDS">Redis深入浅出——字符串和SDS
- Redis源码分析(sds)">Redis源码分析(sds)
- 为什么redis中会采用skiplist">为什么redis中会采用skiplist
- redis源码解读(一):基础数据结构之SDS">redis源码解读(一):基础数据结构之SDS
- C++中string类和Redis中SDS的比较">C++中string类和Redis中SDS的比较
- redis中SDS实现">redis中SDS实现
- Redis整数集合(intset)的升级操作">Redis整数集合(intset)的升级操作
- redis源码分析-ziplist(压缩链表)">redis源码分析-ziplist(压缩链表)
- redis中SDS与C语言中字符串的对比">redis中SDS与C语言中字符串的对比
- Redis源码剖析和注释(五)—- 整数集合(intset)">Redis源码剖析和注释(五)—- 整数集合(intset)
- Redis 底层中的 SDS 以及 对象系统简介">Redis 底层中的 SDS 以及 对象系统简介
- redis之存储—-数据结构">redis之存储—-数据结构
- redis - 简单动态字符串 sds">redis - 简单动态字符串 sds
- 【redis】字符串实现原理sds">【redis】字符串实现原理sds
- Redis开源代码读书笔记六(sds模块)">Redis开源代码读书笔记六(sds模块)
- Redis源码剖析—动态字符串SDS">Redis源码剖析—动态字符串SDS
- redis源码分析(八)、redis数据结构之压缩ziplist————ziplist.c ziplist.h学习笔记">redis源码分析(八)、redis数据结构之压缩ziplist————ziplist.c ziplist.h学习笔记
- 跳跃表skiplist参考文档">跳跃表skiplist参考文档
- redis压缩列表ziplist的连锁扩容">redis压缩列表ziplist的连锁扩容
- Redis学习(6)——压缩列表(ziplist)">Redis学习(6)——压缩列表(ziplist)
Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist)
本文作者生活不只*眼前的苟且
本文出处:https://blog.csdn.net/u011734144/article/details/86086749
版权声明:本文为博主原创文章,未经博主允许不得转载。
首先本文参考的是这个系列的文章:
https://mp.weixin.qq.com/s?__biz=MzA4NTg1MjM0Mg==&mid=509777776&idx=1&sn=e56f24bdf2de7e25515fe9f25ef57557&mpshare=1&scene=1
博主写的非常好,非常详细,我个人看完后,对核心部分进行了如下总结
第一层面,从使用者的角度value有这几种结构: (注意,key的结构都是string类型的)
string、list、hash、set、sortedset
第二层面,从内部实现的角度,有如下几种结构:
dict、sds、ziplist、quicklist、skiplist
Redis通过组合第一层面的数据结构来实现第二层面的数据结构
一、dict实现原理
在Redis中,dict是一个基于哈希表的算法,采用拉链法解决冲突,并在装载因子超过预定值时自动扩展,引发重哈希
重哈希: 这是一种增量试重哈希,在需要扩展内存时避免一次性对所有key进行重哈希,而是将重哈希操作分散到对每个dict的各个增删该查的操作中去,这种方法能做到每次只对一小部分key进行重哈希,而每次重哈希之间不影响dict的操作。之所以这样设计是为了避免重哈希期间单个请求的响应时间剧烈增加。
为了实现重哈希,dict的数据结构里包含两个哈希表ht[0]和ht[1],在重哈希期间,数据从第一个哈希表向第二个哈希表迁移, 当数据全部从ht[0]迁移到ht[1]上后,整个重哈希就结束, ht[0]变成ht[1]的内容,而ht[1]则重置为空
此外,一个状态rehashidx可标记当前重哈希的状态
下面分三种操作来说明底层执行的逻辑,分别是查找、插入和删除
共同点:三个操作都会触发重哈希过程向前推进至少n步,即重哈希一部分key,从而将整个重哈希分散到每个增删改查操作中
每步重哈希key的数量:一个bucket,即一个dictEntry链表(冲突链表)
a、dict查找
从从ht[0]中查找,如果找到则返回; 如果没找到并且当前正在冲哈希,则从ht[1]上查找
b、dict插入
如果正在重哈希,将数据插入到ht[1],否则插入到ht[0]
c、dict删除
如果正在重哈希,则从ht[0]和ht[1]中查找并删除;否则从ht[0]中查找并删除
二、sds实现原理
全称:Simple Dynamic String
这种存储结构的特点:
可动态扩展内存,sds表示的字符串其内容可以修改也可以追加
二进制安全,sds能存储任意二进制数据,而不仅仅是可打印字符
sds字符串的数据结构: 由两部分组成,他们在内存地址上前后相邻,从而节省内存
一个header, 通常包含字符串的长度len、最大容量alloc和flags,但是sdshdr5有所不同,sds总共有5种类型的header
一个字符数组,存储真正的有效字符串数据
这种结构的优点:
header和数据相邻,不用分成两块内存空间来单独分配,有利于减少内存碎片,提高存储效率
sds的一些基础函数:
* sdslen(const sds s): 获取sds字符串长度。
* sdssetlen(sds s, size_t newlen): 设置sds字符串长度。
* sdsinclen(sds s, size_t inc): 增加sds字符串长度。
* sdsalloc(const sds s): 获取sds字符串容量。
* sdssetalloc(sds s, size_t newlen): 设置sds字符串容量。
* sdsavail(const sds s): 获取sds字符串空余空间(即alloc - len)。
* sdsHdrSize(char type): 根据header类型得到header大小。
* sdsReqType(size_t string_size): 根据字符串数据长度计算所需要的header类型。
浅谈sds和Redis的string类型的关系:
Redis的命令append底层用sds的sdscatlen实现
Redis的setbit和getrange命令都是先根据key取得整个sds字符串,然后再从字符串选取或修改制定的部分
上面说的是当value存储的是字符串时的情况;当value存储的值是一个数字的时候,它会支持incr/decr操作,此时的内部存储就不是sds了
三、robj实现原理(redisObject)
Redis中的数据的key都是string类型,value可以是多种类型,比如string,list,hash等
那么这个从key到value的映射关系,内部是用一个前面讲的dict来维护的,dict的key因为都是string类型,所以用sds来表达就足够了, 而value比较复杂,为了在同一个dict内能存储不同类型的value,就定义了一种通用的数据结构robj, 全名是redisObject
比如,如果value是一个list,那么它的内部存储结构是一个quicklist; 如果value是一个string,那么它的内部存储结构一般情况下是sds,当然实际更复杂一点,比如当string类型的value是数字时,redis内部还会把它转换成long来节省内存,
一个robj类型包含如下5个字段:
type:对象的数据类型,可能的取值OBJ_STRING、OBJ_LIST、OBJ_SET、OBJ_ZSET、OBJ_HASH, 分别对应Redis对外暴露的5种数据结构
encoding:对象的内部标识方式,不同的表示方式占用的内存不同,对查找性能也有影响
lru:做lru算法用
refcount:引用计数,它允许robj对象在某些情况下被共享
ptr:数据指针,指向真正的数据,比如一个代表string的robj,它的pt可能指向一个sds结构;一个代表list的robj,它的ptr可能指向一个quicklist
robj对象的作用:
为多种数据类型提供统一的表示方式
允许同一类型的数据采用不同的内部表示,从而在某些情况下尽量节省内存
支持对象共享和引用计数,当对象被共享的时候,只占用一份内存拷贝,进一步节省空间
深谈sds和Redis的string类型的关系:
确切的说,string在Redis中是用一个robj来表示的
用来表示string的robj,如果string是数字,那么会被转换成long存储
在对string进行incr/decr等操作的时候,若内部是OBJ_ENCODING_INT编码,则直接加减;否则,会先试图把sds存储的字符串转成long型再加减
在对一个内部表示成long型的string执行append、setbit或getrange操作的时候,针对的仍然是string的值(即仍然操作的是十进制表示的字符串), 比如字符串“32”,它是整数,执行这几个操作的时候,直接操作的字符串“32”对应位,而不是32对应的整形0x0000000000000020的位
四、ziplist实现原理
ziplist是一个经过特殊编码的双向链表,设计的目标是为了提高存储效率,ziplist可以用于存储字符串或者整数,其中整数是按照二进制表示进行编码的,而不是编码成字符串序列。
ziplist不是普通的双向链表, 普通的双向链表每一项都占用独立的一块内存,各项之间用地址指针连接起来,这会造成大量的内存碎片,而且地址指针也占用额外的内存。 ziplist是将表中每一项放在前后连续的地址空间中,一个ziplist整体占用一大块内存,它是一个表(list), 但其实不是一个链表
另外,ziplist为了在细节上节省内存,对于值的存储采用了变长的编码方式,即对于大的整数,就多用一些字节来存储,对于小的整数就少用一些字节存
ziplist的数据结构定义:
这各个部分在内存上是前后相邻的
.
.
.
.
.
再来看下
.
.
.:实际的数据
变长编码: prevrawlen和len两个字段是变长编码,基于相关data的长度,这两个字段的长度是不同的
hash与ziplist的关系:
hash结构随着数据量的增大,其底层数据结构的实现会发生变化,存储效率也就不同了
在hash中field比较少时,各个value值也比较小的时候,hash采用ziplist来实现;而随着field增多和value值增大,hash可能会变成dict来实现。
那么到底插入多少后才会从ziplist转成dict呢? 跟redis的如下两个配置有关:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
Redis的hash这样设计的原因,是因为ziplist变得很大的时候,它有如下缺点:
.每次插入或修改引发的realloc(扩容)操作会有更大的概率造成内存拷贝,从而降低性能
.一旦发生内存拷贝,内存拷贝的成本也相应增加,因为要拷贝更大的一块数据
.当ziplist数据项过多的时候,在它上面查找指定的数据项就会性能变得很低,因为ziplist上的查找需要进行遍历
五、quicklist实现原理
Redis对外暴露的List数据类型,底层实现用的就是quicklist
quicklist的实现是一个双向链表,链表的每一个节点都是一个ziplist, 为什么quicklist要这样设计呢? 其实也是一个空间和时间的折中
.双向链表便于在表的两端进行push和pop操作,但是它的内存开销比较大。 首先它在每个节点上除了要保存数据之外,还要额外保存两个指针;其次双向链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎片
.ziplist由于是一整块连续内存,所以存储效率很高,但是它不利于修改操作,每次数据变动都会引发一次内存的realloc。特别是当ziplist长度很长的时候,一次realloc可能会导致大批量的数据拷贝,进一步降低性能
这样设计的问题, 到底一个quicklist节点包含多长的ziplist合适?这是一个找平衡的问题:
.每个quicklist节点上的ziplist越短,则内存碎片越多,极端情况是一个ziplist只包含一个数据项,这就退化成了普通的双向链表
.每个quicklist节点上的ziplist越长,则为一个ziplist分配大块连续内存的难度就越大,有可能出现内存里有很多小块的内存空间,但却找不到一块足够大的空闲空间分给ziplist。极端情况是整个quicklist只有一个节点,这就退化成了一个ziplist了
这个平衡问题可基于如下Redis参数配置:
list-max-ziplist-size -2
六、skiplist(跳跃表)
skiplist是为了实现sorted set这种对外的数据结构, 其结构如下:
比较好的策略是:上下相邻的两层链表节点个数的关系是2:1, 如果要维护这种比例关系,当插入节点的时候,就需要把它后面的所有节点重新调整,删除也是,这会让时间复杂度蜕化成O(n)。
skiplist采用的策略:它不要求上下相邻两层链表之间的节点个数有严格的对应关系,而是为每个新插入的节点随机出一个层数, 因此插入操作只需要修改插入节点前后的指针,而不需要对很多节点进行调整,这降低了复杂度,这是它在插入性能上明显优于平衡树的方案
实际应用中skiplist每个节点应该包含key和value两部分,列表是按照key进行排序的,查找过程也是根据key在比较
在Redis中,skiplist被用于实现暴露给外部的sorted set,但是准确的说,sorted set底层不仅适用了skiplist,还是用了ziplist和dict
总结来说:
.当数据较少时,sorted set是用一个ziplist来实现,插入时插入两个数据项:数据在前,score在后,查找时顺序查找
.当数据多的时候,sorted set由zset实现,即由一个dict+一个skiplist来实现。 dict用来查询数据到分数的对应关系,而skiplist用来根据分数查询数据(可能是范围查找)
那么什么时候开始切换实现方式呢? 基于如下两个配置:两个条件满足一个就会切换zset
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
zset的结构定义如下: 可以看到它就是基于dict+ziplist
typedef struct zset {
dict *dict;
zskiplist *zsl;
} zset;
另外,Redis中对skiplist做了扩展: (Redis中的skiplist和经典的skiplist的比较)
.分数允许重复,即skiplist的key允许重复(分数是skiplist中的key),这在经典的skiplist中是不允许的
.在比较时,不仅比较分数(skiplist的key),还比较数据本身
.第1层链表不是一个单向链表,而是一个双向链表,这是为了方便以倒序方式获取一个范围内的元素
七、intset实现原理
它是整数的集合,确切的说是整数组成的有序集合,从而便于在上面进行二分查找,从而快速判断一个元素是否属于这个集合,它在内存分配上与ziplist类似,是连续的一整块内存空间, 并且对于大整数和小整数采取不同的编码,进来对内存进行优化, 其结构如下:
typedef struct intset {
uint32_t encoding;
uint32_t length;
int8_t contents[];
} intset;
encoding:数据编码,表示每个整数用几个字节来存储
length:表示intset中的元素个数
contents:数据元素
intset和ziplist的比较:
.ziplist可以存储任意二进制串,intset只能存储整数
.ziplist是无序的,而intset是从小到大有序的,因此在ziplist上查找只能遍历,而在intset上可以进行二分查找,性能更高
.ziplist可以对每个数据项进行不同的变长编码,而intset只能整体用一个统一的编码, 所以intset随着新元素的添加,需要根据元素大小决定是否对数据编码进行升级
Redis的Set的底层实现:
.当Set中添加的元素都是整型切元素数据较少时,Set使用intset作为底层数据结构
.否则,Set底层使用dict作为数据结构(即元素不是整型或者元素是整型但是数据已经较多了用dict)
这通过如下参数来配置:
set-max-intset-entries 512
最后总结下第一层面的数据类型和第二层面的数据类型对应关系:
第一层面(使用者) | 第二层面(底层) |
---|---|
String | sds、long |
Hash | ziplist、dict |
List | quicklist |
Set | intset、dict |
ZSet | skiplist、ziplist、dict |
Redis内部数据结构详解(4)——ziplist
阅读数 2485
本文是《Redis内部数据结构详解》系列的第四篇。在本文中,我们首先介绍一个新的Redis内部数据结构——ziplist,然后在文章后半部分我们会讨论一下在robj,dict和ziplist的基础上,…博文来自: yellowriver007的专栏
为什么说redis的ziplist节约内存
01-26
为什么说redis的ziplist节约内存,看了他的数据结构,没catch到他节约内存这个点啊。大神们指点一下。论坛
redis 源码学习笔记—ziplist数据结构
阅读数 185
Ziplist是由一系列特殊编码的内存块构成的列表, 哈希键、列表键和有序集合键初始化的底层实现皆采用ziplist。学习ziplist结构意义重大,本篇试着剖析ziplist的结构。本着学习的目的,…博文来自: 专注于网络编程,游戏后台,高并发
redis源码之压缩列表ziplist
阅读数 1710
未完待续…压缩列表ziplist1.简介压缩列表是Redis为了节约内存而开发的,由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。2.组成属性类型长度用途zlbytesuin…博文来自: 897901160
redis数据结构实现—压缩列表(ziplist)
阅读数 77
压缩列表(ziplist)是链表键和哈希键的底层实现之一。当链表键或哈希键只有少量列表项,且列表项中是小整数值或短字符串,则会采用压缩列表作为底层实现。6.1压缩列表的实现压缩列表是为了节约内存而开发…博文来自: weixin_40581617的博客
redis源码中的ziplist zskiplist 压缩表和跳表
阅读数 283
在压缩双链表中,节省了前驱和后驱指针的空间,在64位机器上共节省了8个字节,这让数据在内存中更为紧凑。只要清晰的描述每个数据项的边界,就可以轻易得到前驱后驱数据项的位置,ziplist就是这么做的。z…博文来自: 慕鹞
redis原理总结
阅读数 3616
redis单点吞吐量单点TPS达到8万/秒,QPS达到10万/秒。redis的5中存储类型string、list、set、map(hash)、stored-setredis的string类型能表达3中…博文
Redis源码分析(skiplist)
阅读数 1468
源码版本:redis-4.0.1源码位置:server.h:zskiplistNode和zskiplist的数据结构定义。t_zset.c:以zsl开头的函数是SkipList相关的操作函数。一、跳跃…博文来自: 杨博东的博客
Redis内部数据结构总结(3)ziplist
阅读数 1662
redis对外的数据结构hash的底层是ziplist或者dict。 ziplist是一个经过特殊编码的双向链表,其设计目的就是为了提高存储效率。ziplist可以用于存储字符串或正数,其中整数…博文来自: kkgbn的博客
Redis数据结构——intset(整数集合)
阅读数 69
整数集合是redis集合键的底层实现之一,如果一个集合只包含整数值元素,而且元素数量不多,redis就会用整数集合作为集合键的底层实现(redis集合键的另一种底层实现是跳表)。 一、整数集合的应用场…博文来自: cxc576502021的专栏
Redis内部数据结构详解(7)——intset - zhaoliang83121…_CSDN博客
7-10
set使用intset作为底层数据结构,否则,set使用dict作为…(例如sds, quicklist, skiplist),用于表达一…Redis底部的几种存储结构(sds、dict、ziplist、intset…
Redis内部数据结构详解(2)——sds - yellowriver007的…_CSDN博客
Redis源码剖析和注释(七)—- 快速列表(quicklist)
阅读数 4355
Redis快速列表(quicklist)1.介绍quicklist结构是在redis3.2版本中新加的数据结构,用在列表的底层实现。通过列表键查看一下:redis列表键命令详解127.0.0.1:63…博文来自: men_wen的博客
Redis数据结构——intset(整数集合) - cxc576502021的…_CSDN博客
…数据结构与对象 skiplist intset ziplist - asmartk…_CSDN博客
6-16
Redis 3.0源码分析-数据结构与对象 skiplist intset ziplist2019年05月30日 14…Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist) 01-08 …
Redis源码剖析—quicklist
阅读数 768
quicklist概述上一节中,我们有说到Redis中的列表对象在版本3.2之前,列表底层的编码是ziplist和linkedlist实现的,但是在版本3.2之后,重新引入了一个quicklist的数…博文来自: harleylau的博客
Redis源码剖析—快速列表quicklist
阅读数 2749
在RedisObject这一篇博客中,有介绍到list结构的底层编码类型有OBJ_ENCODING_QUICKLIST,当时就发现这个底层数据结构被我遗漏了。昨天花了点时间补了补这个知识,看完发现这货…博文来自: ZeeCoder
【redis】ziplist详细解析 - LIncoLN的博客 - CSDN博客
Redis源码学习简记(四)ziplist与zipmap压缩编码原理与…_CSDN博客
Redis源码剖析和注释(六)—- 压缩列表(ziplist)
阅读数 4663
Redis压缩列表(ziplist)1.介绍压缩列表(ziplist)是哈希键的底层实现之一。它是经过特殊编码的双向链表,和整数集合(intset)一样,是为了提高内存的存储效率而设计的。当保存的对象…博文来自: men_wen的博客
Redis源码剖析——有序集合对象
阅读数 337
有序集合对象有序集合的对象的编码可以为ziplist或者skiplistziplist实现有序集合当满足下面两个条件时,有序集合的底层数据结构为skiplist1.元素数量小于128个2.所有元素成员…博文来自: ProgrammingLearner的博客
Redis存储结构 - 菜鸟可以飞的博客 - CSDN博客
2-28
在Redis内部,有非常多的数据结构:sds(简单动态字符串),list,intset(整数集合),hash(字典),zskiplist(跳跃表),ziplist(压缩表)等。 …
redis源码解读(一):基础数据结构之SDS - czrzchao的博客 - CSDN博客
7-9
dict(Hash Tables):字典 intset:整数集合 ziplist:…skiplist:跳跃链表 SDS redis 没有直接使用c语言的…Redis底部的几种存储结构(sds、dict、ziplist、intset…
【redis】ziplist详细解析
阅读数 421
本文根据5.0.2版本的redis源码详细解析ziplist数据结构。 1创建一个ziplistziplist的内存结构如上图。一个uint32_t的totalsize,保存当前ziplist所占用内…博文来自: LIncoLN的博客
Redis哈希对象的ziplist编码实现了O(1)复杂度吗
阅读数 1212
问题描述问题:Redis中哈希对象有两种编码方式,分别是ziplist、hashtable方式。哈希对象,总得体现哈希算法,使得基本操作达到O(1)的效率。hashtable编码方式使用字典,也即是J…博文来自: zhoucheng05_13的博客
Redis 源码—省内存大法—intset和ziplist - weixin_33…_CSDN博客
6-22
intset是一种具有一致类型数据的set,它里面的数据可以是int_16 int_32 int_64…Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist) 01-08 …
redis源码分析-intset(整型集合)
阅读数 1628
intset,一种特殊的set数据结构,由多个整型元素组成。intset也是一个有序整型集合,其内部设计非常精巧。intset数据结构与往常一样,先了解intset数据结构:typedefstruct…博文来自: coding….
_Redis_2.8和4.0的基本数据结构
阅读数 3198
redis数据结构,网上资料也很多,redis设计与实现书上讲的也很明白,具体的也可以参考博客专栏,这里只对redis2.8和4.0版本做个简单的对比:http://blog.csdn.net/col…博文来自: kimichen123的专栏
Redis源码分析(intset)
阅读数 1076
源码版本:4.0.1源码位置:intset.h:数据结构的定义intset.c:创建、增删等操作实现1.整数集合简介intset是Redis内存数据结构之一,和之前的sds、skiplist、dict…博文来自: 杨博东的博客
[redis] ziplist-压缩双向链表
阅读数 354
redisziplist-压缩双向链表博文来自: gonaYet的博客
redis学习笔记(4)—-跳表zskiplist
阅读数 1549
跳表 跳表(skiplist)是一种有序的数据结构,它通过在每个节点中维护多个指向其它节点的指针,来达到快速访问的目的。 跳表查找的时间复杂度平均为O(lgn),最坏情况下退化为单链表的O(n)。…博文来自: qinm的专栏
Redis源码学习简记(四)ziplist与zipmap压缩编码原理与个人理解
阅读数 124
把两个放在一起说主要是两个都是为了内存的压缩,使得将所有的东西都放在了char*的数组中。根据自定义的一些编码规则,实现增删改查的操作。里面涉及大量的位操作,自定义的decode(解码)和encodi…博文来自: 菜鸟的学习之路
Redis源码剖析——ziplist的实现
阅读数 144
有序集合对象ziplist为Redis中的压缩列表,是列表键和哈希键的底层实现之一,用于存储长度短的字符串和小整数。ziplist采用一段连续的内存来存储节点ziplist的表示因为ziplist的数…博文来自: ProgrammingLearner的博客
redis学习笔记(7)—-压缩字典zipmap
阅读数 2959
zipmap 在hashtable实现中,Redis引入了zipmap数据结构,保证在hashtable刚创建以及元素较少时,用更少的内存来存储,同时对查询的效率也不会受太大的影响。 zipmap…博文来自: qinm的专栏
redis的压缩列表源码ziplist解析
阅读数 165
压缩列表的具体数据结构如下:<zlbytes><zltail><zllen><entry>…博文来自: 凤舞九天 音乐工厂 跳舞大碟 带给你
redis学习笔记(5)—-整数集合intset
阅读数 940
intset 当一个集合中只包含整数,且这个集合中的元素数量不多时,redis就会使用整数集合intset作为集合的底层实现。整数集合的实现typedefstructintset{uint32_te…博文来自: qinm的专栏
Redis设计与实现5 集合对象(intset/hashtable) 的介绍
阅读数 59
集合对象的编码可以是intset或者hashtable。 intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。 举个例子,以下代码将创建一个如图8-12…博文来自: weixin_34416649的博客
Redis设计与实现2 列表键 (linkedlist/ziplist)的介绍
阅读数 76
Redis的列表对象(listobject)底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis会使用链表作为列表键的底层实现。当一个列表键…博文来自: weixin_33813128的博客
redis学习笔记(6)—-压缩列表ziplist
阅读数 6014
ziplist 压缩列表是列表键和哈希键的底层实现之一。 当一个列表键只包含少量表项,并且每个列表项要么是小整数,要么是较短的字符串,那么redis就会使用压缩列表来作为列表键的底层实现。 当一…博文来自: qinm的专栏
Redis深入浅出——字符串和SDS
阅读数 2182
一、字符串字符串的类信息定义1.1字符串介绍字符串是Redis中最为常见的数据存储类型,其底层实现是简单动态字符串sds(simpledynamicstring),是可以修改的字符串。它类似于Java…博文来自: 我的博客
Redis源码分析(sds)
阅读数 1884
一、SDS简介sds(SimpleDynamicString),Simple的意思是简单,Dynamic即动态,意味着其具有动态增加空间的能力,扩容不需要使用者关心。String是字符串的意思。说白了…博文来自: 杨博东的博客
为什么redis中会采用skiplist
阅读数 589
redis既然是单线程,采用skiplist作为索引,相对于传统的红黑树而言,查询速度相仿,优势在哪里关键在于redis是一个经常需要做插入删除操作的kv容器。redis有超时剔除机制,需要对key维…博文来自: load2006的专栏
redis源码解读(一):基础数据结构之SDS
阅读数 1230
近来在研读redis3.2.9的源码,虽然网上已有许多redis的源码解读文章,但大都不成系统,且纸上学来终觉浅,遂有该系列博文。部分知识点参照了黄建宏的《Redis设计与实现》。前言本文探究的数据结…博文来自: czrzchao的博客
C++中string类和Redis中SDS的比较
阅读数 715
Redis中SDS与C++中string类的比较博文来自: 在雨一方
redis中SDS实现
阅读数 281
sds(simpledynamicstring)是Redis自己构建的字符串,作为Redis默认的字符串表示。/ 类型别名,用于指向sdshdr的buf属性 /typedefcharsds;/…博文来自: sysucph的专栏
Redis整数集合(intset)的升级操作
阅读数 739
当Redis中的Set(集合)只存有整数值元素的时候,并且元素的数目并不是非常多的时候,就会使用intset(整数集合)作为集合键的底层实现。127.0.0.1:6381>SADDnumbers246…博文来自: 未绪
redis源码分析-ziplist(压缩链表)
阅读数 1032
ziplist结构在redis运用非常广泛,是列表、字典等数据类型的底层结构之一。ziplist的优点在于能够一定程度地节约内存。ziplist构成ziplist结构由zip_header、zip_e…博文来自: coding….
redis中SDS与C语言中字符串的对比
阅读数 146
redis并没有直接重用C语言中的字符串,而是自己定义了一个SDS(SDS结构在另一篇文章中)。在存储时,SDS中的buf数组沿用了C语言以空字符串结尾的惯例,方便重用一部分C语言的函数库。那么为什么…博文来自: bettyF的博客
Redis源码剖析和注释(五)—- 整数集合(intset)
阅读数 1858
Redis整数集合(intset)1.介绍整数集合(intset)是集合键底层实现之一。集合键另一实现是值为空的散列表(hashtable),虽然使用散列表对集合的加入删除元素,判断元素是否存在等等操…博文来自: men_wen的博客
Redis 底层中的 SDS 以及 对象系统简介
阅读数 75
1.SDS没有使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simpledynamicstring,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。在Redis里,包…博文来自: cosmos_lee
redis之存储—-数据结构
阅读数 801
上一篇中我们讲到了redis的4种底层数据结构支撑,这一篇学习存储数据结构的实现。 redis的值value支持5种类型数据的存储。分别是1.字符串2.列表3.有序集合4.哈希表5.集合,千万不要觉…博文来自: tingyun_say的博客
redis - 简单动态字符串 sds
阅读数 831
数据结构,源码://最大预分配长度#defineSDS_MAX_PREALLOC(1024*1024)#include#include//Redis没有直接使用sdshdr结构,而是定义了sds类型来…博文来自: arkblue的专栏
【redis】字符串实现原理sds
阅读数 333
redis键值对中的key都是string类型的。redis内部实现中是怎么处理string呢?redis底层是用c写的,对于stirng并没有直接使用c的字符数组,而是自己封装了一个sds的类型。结…博文来自: u010900754的专栏
Redis开源代码读书笔记六(sds模块)
阅读数 816
SDS是一个动态字符串库,主要用于字符串操作。SDS模块功能特性==》支持字符串基本操作(new,free,dup,cpy,append,add,trim,cmp,range,split,join,l…博文来自: lida2003的专栏
Redis源码剖析—动态字符串SDS
阅读数 1486
请持续关注我的个人博客:https://zcheng.renRedis没有使用C语言的字符串结构,而是自己设计了一个简单的动态字符串结构sds。它的特点是:可动态扩展内存、二进制安全和与传统的C语言字…博文来自: ZeeCoder
redis源码分析(八)、redis数据结构之压缩ziplist————ziplist.c ziplist.h学习笔记
阅读数 341
一、介绍ziplist/Theziplistisaspeciallyencodedduallylinkedlistthatisdesignedtobeverymemoryefficient.*Zi…博文来自: chen
跳跃表skiplist参考文档
redis压缩列表ziplist的连锁扩容
阅读数 88
redis中的压缩列表在插入数据的时候可能存在连锁扩容的情况。在压缩列表中,节点需要存放上一个节点的长度,当上一个entry节点长度小于254个字节的时候,将会一个字节的大小来存放entry中的数据,…博文来自: 凤舞九天 音乐工厂 跳舞大碟 带给你
Redis学习(6)——压缩列表(ziplist)
阅读数 56
今天学习Redis的压缩列表(ziplist),看着书上写的:压缩表是列表键和哈希键的底层实现之一。于是自己就在Redis上试了一下,可是在测试列表键的时候却发现查看属性,发现不是“ziplist”而…博文来自: H1517043456的博客
机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
native底部 react mysql关联查询两次本表 extjs glyph 图标 redis学习java java学习redis