文章目录
- 常用数据结构
- Redis的编码方式
- 查看方式
常用数据结构
Redis当中常用的数据结构如下所示:
Redis在底层实现上述数据结构的过程中,会在源码的角度上对于上述的内容进行特定的优化,这样的优化的主要目的是为了实现出节省时间和节省空间的效果,具体的优化方法当然还是要看的是具体的内容
Redis在外部承诺,对于哈希表来说,保证用户在进行增删查改这些操作都能保证是O(1),但是具体内部的实现来说,其实并不是一个传统意义的哈希表,在特定的实现场景下会使用其他的数据结构来实现,但是总体上来说,还是能够保证时间复杂度是满足具体的要求的
所以我们说,对于Redis内部的数据结构或者说是数据类型来说,这是Redis承诺给用户的,但是在其内部的实现中,可能会不同,具体的方式是有编码方式来进行决定的,因此换句话说,对于同一个数据结构来说,内部会有不同的实现方式,在不同的场景下会使用不同的方式,但是作为上层的使用者,其实是感知不到这样的存在的
那么下面我将会进行分析,不同的数据结构内部代表的意义是什么,以及是如何进行场景优化的
Redis的编码方式
string
先说string类型,这个类型并不陌生,就是一个字符串类型,在内部编码的角度来讲:
- 如果采用的是raw,表示的是最基本的字符串,它的底层就是一个char的数组
- 而如果采用的是int的编码方式,则对应的场景可能是要使用一些类似于计数的功能,那么此时作为Value值,其实使用传统意义的字符是没有意义的,直接使用整数int来保存是一个更好的解决方案
- 如果采用的是embstr,则表示的是针对于短字符串进行的特殊优化,这里就不再过多描述
hash
- hash这种数据类型,或者说是数据结构,是有两种编码方式的,第一种是hashtable,这种实现方式就是最基本的实现方式,Redis内部也是用这种最基本的方式来实现的,虽然这里的实现方式和前面的不太一样,但是也大体思维差不多
- 而对于一些元素比较少的时候,如果还使用哈希表其实是没有意义的,因此就会把对应的编码方式更换为ziplist,它的主要目的可以进行列表的压缩,这样可以节省空间
压缩的意义?
那到此,可能会关心的问题是,为什么要进行压缩?意义在哪呢?因为Redis内部是有很多的key值的,这就意味着对于某些key的Value是一个hash,所以当key值比较多的时候,对应的hash结构也会比较多,但是每一个hash的实际占用其实不大,因此就可以选择去尽量的压缩,这样压缩后就可以使得整体上的占用变的比较少了
list
对于list来说,有两种实现的方式,一种是linkedlist,也就是传统意义上的list,而另外一个表示的是压缩列表,但是从Redis 3.2开始,采用的是一个全新的方式,叫做quicklist,它可以综合前面的两种类型,这样就针对于空间和效率折中进行实现的
set
对于set来说,也有两种实现,第一个是传统意义的实现,第二个表示的是intset,如果都是使用的int类型的数据,那么内部就会选择这种情况
zset
- skipset,是跳表,每个节点上有多个指针域,可以快速定位到类型,最终使得搜索效果完成到二叉搜索树的效果,这里不再赘述,前面的内容中已经有对应的策略~
- ziplist:压缩
查看方式
object encoding xxx
Redis内部,会通过具体的实际情况来调整内部的编码方式,自动进行适应