本文是《Redis内部数据结构详解》系列的第七篇。在本文中,我们围绕一个Redis的内部数据结构——intset展开讨论。Redis里面使用intset是为了实现集合(set)这种对外的数据结构。set结构类似于数学上的集合的概念,它包含的元素无序,且不能重复。Redis里的set结构还实现了基础的集合并、交、差的操作。与Redis对外暴露的其它数据结构类似,set的底层实现,随着元素类型是否是整型以及添加的元素的数目多少,而有所变化。概括来讲,当set中添加的元素都是整型且元素数目较少时,set使用intset作为底层数据结构,否则,set使用dict作为底层数据结构。在本文中我们将大体分成
本文是《Redis内部数据结构详解》系列的第六篇。在本文中,我们围绕一个Redis的内部数据结构——skiplist展开讨论。Redis里面使用skiplist是为了实现sortedset这种对外的数据结构。sortedset提供的操作非常丰富,可以满足非常多的应用场景。这也意味着,sortedset相对来说实现比较复杂。同时,skiplist这种数据结构对于很多人来说都比较陌生,因为大部分学校里的算法课都没有对这种数据结构进行过详细的介绍。因此,为了介绍得足够清楚,本文会比这个系列的其它几篇花费更多的篇幅。我们将大体分成三个部分进行介绍:介绍经典的skiplist数据结构,并进行简单的算法分
本文是《Redis内部数据结构详解》系列的第五篇。在本文中,我们介绍一个Redis内部数据结构——quicklist。Redis对外暴露的list数据类型,它底层实现所依赖的内部数据结构就是quicklist。我们在讨论中还会涉及到两个Redis配置(在redis.conf中的ADVANCEDCONFIG部分):list-max-ziplist-size-2list-compress-depth0我们在讨论中会详细解释这两个配置的含义。注:本文讨论的quicklist实现基于Redis源码的3.2分支。quicklist概述Redis对外暴露的上层list数据类型,经常被用作队列使用。比如它支
本文是《Redis内部数据结构详解》系列的第四篇。在本文中,我们首先介绍一个新的Redis内部数据结构——ziplist,然后在文章后半部分我们会讨论一下在robj,dict和ziplist的基础上,Redis对外暴露的hash结构是怎样构建起来的。我们在讨论中还会涉及到两个Redis配置(在redis.conf中的ADVANCEDCONFIG部分):hash-max-ziplist-entries512hash-max-ziplist-value64本文的后半部分会对这两个配置做详细的解释。什么是ziplistRedis官方对于ziplist的定义是(出自ziplist.c的文件头部注释):
本文是《Redis内部数据结构详解》系列的第三篇,讲述在Redis实现中的一个基础数据结构:robj。那到底什么是robj呢?它有什么用呢?从Redis的使用者的角度来看,一个Redis节点包含多个database(非cluster模式下默认是16个,cluster模式下只能是1个),而一个database维护了从keyspace到objectspace的映射关系。这个映射关系的key是string类型,而value可以是多种数据类型,比如:string,list,hash等。我们可以看到,key的类型固定是string,而value可能的类型是多个。而从Redis内部实现的角度来看,在前面第
本文是《Redis内部数据结构详解》系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds。不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构。sds正是在Redis中被广泛使用的字符串结构,它的全称是SimpleDynamicString。与其它语言环境中出现的字符串相比,它具有如下显著的特点:可动态扩展内存。sds表示的字符串其内容可以修改,也可以追加。在很多语言中字符串会分为mutable和immutable两种,显然sds属于mutable类型的。二进制安全(BinarySafe)。sds能存储任意二进制数据,而不仅仅是可打印字符。与传统的C语言字符串类型兼容。这个的含
如果你使用过Redis,一定会像我一样对它的内部实现产生兴趣。《Redis内部数据结构详解》是我准备写的一个系列,也是我个人对于之前研究Redis的一个阶段性总结,着重讲解Redis在内存中的数据结构实现(暂不涉及持久化的话题)。Redis本质上是一个数据结构服务器(datastructuresserver),以高效的方式实现了多种现成的数据结构,研究它的数据结构和基于其上的算法,对于我们自己提升局部算法的编程水平有很重要的参考意义。当我们在本文中提到Redis的“数据结构”,可能是在两个不同的层面来讨论它。第一个层面,是从使用者的角度。比如:stringlisthashsetsortedse