redis对象
前面的章节,介绍了Redis泳道的主要数据结构,比如简单动态字符串,双端列表,字典,压缩列表,整数集合等等。Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于数据结构创建了一个对象系统,这个系统包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种前面说的数据结构。
对象的类型和编码
Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键,另一个对象用作键值对的值。
|
|
类型
类型常量 | 对象的名称 |
---|---|
REDIS_STIRNG | 字符串对象 |
REDIS_LIST | 列表对象 |
REDIS_HASH | 哈希对象 |
REDIS_SET | 集合对象 |
REDIS_ZSET | 有序集合对象 |
编码和底层实现
对象的prt指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现。
编码常量 | 编码所对应的底层数据结构 |
---|---|
REDIS_ENCODING_INT | long类型的整数 |
REDIS_ENCODING_EMBSTR | embstr编码的简单动态字符串 |
REDIS_ENCODING_RAW | 简单动态字符串 |
REDIS_ENCODING_HT | 字典 |
REDIS_ENCODING_LINKEDLIST | 双端链表 |
DRDIS_ENCODING_ZIPLIST | 压缩列表 |
REDIS_ENCODING_INTSET | 整数集合 |
REDIS_ENCODING_SKIPLIST | 跳跃表和字典 |
每种类型的对象都至少使用了两种不同的编码。
类型 | 编码 | 对象 |
---|---|---|
REDIS_STRING | REDIS_ENCODING_INT | 使用整数值实现的字符串对象 |
REDIS_STRING | REDIS_ENCODING_EMBSTR | 使用embstr编码的简单动态字符串实现的字符串对象 |
REDIS_STRING | REDIS_ENCODING_RAW | 使用简单动态字符串实现的字符串对象 |
REDIS_LIST | REDIS_ENDOGING_ZIPLIST | 使用压缩列表实现的列表对象 |
REDIS_LIST | REDIS_ENDOGING_LINKEDLIST | 使用双端列表实现的列表对象 |
REDIS_HASH | REDIS_ENDOGING_ZIPLIST | 使用压缩列表实现的哈希对象 |
REDIS_HASH | REDIS_ENDOGING_HT | 使用字典实现的哈希对象 |
REDIS_SET | REDIS_ENDOGING_INTSET | 使用整数集合实现的哈希对象 |
REDIS_SET | REDIS_ENDOGING_HT | 使用字典集合实现的哈希对象 |
REDIS_ZSET | REDIS_ENDOGING_ZIPLIST | 使用压缩列表实现的有序列表集合 |
REDIS_ZSET | REDIS_ENDOGING_SKIPLIST | 使用跳跃表实现的有序集合 |
redis跳跃表
跳跃表(skiplist)是一种有序数据结构,他通过在每个节点维持多个指向其他节点的指针,从来打到快速访问节点的目的。
跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。
在大部分情况下,跳跃表的效率可以和平衡树媲美,并且因为跳跃表的实现比平衡树更为简单,所以有不少程序都使用跳跃表来代替平衡树。
Redis使用跳跃表作为有序结合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中的成员(member)是比较长的字符串,Redis机会使用跳跃表来作为有序集合键的底层实现。和链表、字典等数据结构被广泛应用在Redis内部不同,Redis只在两个地方泳道了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构。
redis链表
每个链表和链表节点的实现
链表节点结构
|
|
链表结构
|
|
dup、free、match成员用于实现多态链表所需的类型特定函数:
- dup函数用于复制链表节点所保存的值。
- free函数用于释放节点所保存的值。
- match函数用户对比链表节点所保存的值和另一个输入值是否相等。