《Redis设计与实现》第八章总结二:五种对象简述

《Redis设计与实现》第八章总结一:对象

7.2 字符串对象

7.2.1 底层所使用的编码方式

int、raw、embstr

  • int:对应的数据结构为long类型的整数
    在这里插入图片描述
    例子:set number 10086
    在这里插入图片描述
  • raw:对应的数据结构为简单动态字符串
    在这里插入图片描述
    例子:set story “Long,long ago there lived a king …”
    在这里插入图片描述
  • embstr:对应的数据结构为embstr编码的简单动态字符串,专门用来保存短字符串的一种优化编码方式
    在这里插入图片描述
    与raw对比:都会使用redisObject结构和sdshdr结构来表示字符串对象,但raw会调用两次内存分配函数来分别创建这两个结构,而embstr则通过一次来分配一块连续的空间,空间依次包含redisObject和sdshdr

比之raw的好处:内存分配/释放函数次数更少、更好地利用缓存
在这里插入图片描述
例子:set msg “hello”
在这里插入图片描述

  • 注意:关于long double类型表示的浮点数

在Redis中,作为字符串值来保存;

操作:如果要保存一个浮点数到字符串对象里面,那么程序会先将这个浮点数转化为字符串值,然后再保存转化所得的字符串值;在有需要的时候,程序会将保存在字符串对象里面的字符串值转化为浮点数值,执行完业务后,将最后得出的浮点数值转化为字符串值继续保存

  • 总结:字符串对象保存各类型值的编码
    在这里插入图片描述

7.2.2 从一种编码转化到另一种编码所需的条件

int和embstr在满足条件的情况下,会转化为raw

  • int:
    在这里插入图片描述
  • embstr:
    在这里插入图片描述

7.2.3 同一个命令在多种不同编码上的实现方法

因为字符串键的值对字符串对象,所以相应的命令都是针对字符串对象来构建的,如下是部分命令及其实现方法:
在这里插入图片描述

7.3 列表对象

7.3.1 底层所使用的编码方式

ziplist、linkedlist

  • ziplist:对应的数据结构为压缩列表,元素少时使用

例子:RPUSH numbers 1 ”three“ 5
在这里插入图片描述

  • linkedlist:对应的数据结构为双端链表,元素多时使用

例子:RPUSH numbers 1 ”three“ 5
在这里插入图片描述
注意:linkedlist编码的列表对象在底层的双向链表中包含了多个字符串对象,这种现象称之为嵌套字符串对象
字符串是五种对象中唯一一种会被其他四种类型对象嵌套的对象
如上图的值为”three“的StringObject,实际上为下图:
在这里插入图片描述

7.3.2 从一种编码转化到另一种编码所需的条件

当列表对象同时满足如下两个条件时,使用ziplist编码,否则就会执行编码转化操作,变为linkedlist:
1.所有字符串元素的长度都小于64字节
2.元素数量少于512个
当然,这两个条件的值可以修改,为配置文件的list-max-ziplist-value选项和list-max-ziplist-entries

编码转化操作:原本保存在压缩列表里的所有列表元素都会被转移并保存到双端链表里面,对象的编码也会从ziplist变为linkedlist

7.3.3 同一个命令在多种不同编码上的实现方法

列表键的值为列表对象,所以用于列表键的命令都是针对列表对象来构建的,以下为部分命令及其实现方法:
在这里插入图片描述

7.4 哈希对象

7.41 底层所使用的编码方式

ziplist、hashtable

  • ziplist:对应的数据结构为压缩链表

保存方式:先将保存了键的节点推入到末尾,再将保存了值的节点保存到末尾;即先进的在头,后进的在尾

例子:
HSET profile name ”Tom“
HSET profile age ”25“
HSET profile career”Programmer“
在这里插入图片描述

  • hashtable:对应的数据结构为字典

保存方式:每个键值对用一个字典键值对来保存,键是一个字符串对象,值也是一个字符串对象,对象中保存了键值

例子:以上述命令、hashtable编码为例,涉及嵌套字符串
在这里插入图片描述

7.4.2 从一种编码转化到另一种编码所需的条件

当哈希对象同时满足如下两个条件时,使用ziplist编码,否则就会执行编码转化操作,变为hashtable:
1.所有键值对的键值字符串长度都小于64字节
2.键值对数量小于512个
当然,这两个条件的值可以修改,为配置文件的hash-max-ziplist-value选项和hash-max-ziplist-entries

编码转化操作:原本保存在压缩列表里的所有键值对都会被转移并保存到字典里面,对象的编码也会从ziplist变为hashtable

7.4.3 同一个命令在多种不同编码上的实现方法

哈希键的值为哈希对象,所以用于哈希键的命令都是针对哈希对象来构建的,以下为部分命令及其实现方法:
在这里插入图片描述

7.5 集合对象

7.5.1 底层所使用的编码方式

intset、hashtable

  • intset:对应的数据结构为整数集合

保存方式:集合对象包含的所有元素都被保存在整数集合里面

例子:SADD numbers 1 3 5
在这里插入图片描述

  • hashtable:对应的数据结构为字典

保存方式:字典的每个键都是一个字符串对象,每个字符串对象包含一个集合元素;字典的值全部设置为null

例子:SADD Dfruits “apple” “banana” “cherry”
在这里插入图片描述

7.5.2 从一种编码转化到另一种编码所需的条件

当哈希对象同时满足如下两个条件时,使用intset编码,否则就会执行编码转化操作,变为hashtable:
1.集合对象保存的所有元素都是整数值
2.元素数量小于等于512个
当然,这两个条件的值可以修改,为配置文件的set-max-intset-entries选项

编码转化操作:原本保存在整数集合里的所有元素都会被转移并保存到字典里面,对象的编码也会从intset变为hashtable

7.5.3 同一个命令在多种不同编码上的实现方法

集合键的值为集合对象,所以用于集合键的命令都是针对集合对象来构建的,以下为部分命令及其实现方法:
在这里插入图片描述

7.6 有序集合对象

有序集合对象的元素:成员都是一个字符串对象,分值都是一个double类型的浮点数

7.6.1 底层所使用的编码方式

ziplist、skiplist

  • ziplist:对应的数据结构为压缩列表

保存方式:每个集合元素实验两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个节点保存元素的分值;压缩列表内的集合元素按分值从小到大排序,小的放表头,大的放表尾

例子:ZADD price 8.5 apple 5.0 banana 6.0 cherry
在这里插入图片描述

  • skiplist:对应的数据结构为zset;一个zset结构同时包含一个字典和跳表,如下图:
    在这里插入图片描述
    zset中的zsl跳表保存方式:按分值从小到大排序,每个跳表节点保存了一个集合元素:object属性保存了元素成员,score属性保存了元素分值;通过跳表,程序可以对有序集合进行范围型操作,如ZRANK、ZRANGE等命令

zset中的dict字典保存方式:为有序集合创建了一个从成员到分值的映射,字典中的每个键值对都保存了一个集合元素:键保存成员,值保存分值;通过字典,程序可以对有序集合进行O(1)的查找指定成员,如ZSCORE命令

使用两种结构的好处:可以让有序集合的查找和范围性操作都尽可能快地执行

例子:ZADD price 8.5 apple 5.0 banana 6.0 cherry;命令同上
在这里插入图片描述

7.6.2 从一种编码转化到另一种编码所需的条件

当有序集合对象同时满足如下两个条件时,使用ziplist编码,否则就会执行编码转化操作,变为skiplist:
1.有序集合对象保存的所有元素成员的长度都小于64字节
2.元素数量小于128个
当然,这两个条件的值可以修改,为配置文件的zset-max-ziplist-entries选项和zset-max-ziplist-value选项

编码转化操作:原本保存在压缩列表里的所有元素都会被转移并保存到zset里面,对象的编码也会从ziplist变为skiplist

7.6.3 同一个命令在多种不同编码上的实现方法

有序集合键的值为哈希对象,所以用于有序集合键的命令都是针对哈希对象来构建的,以下为部分命令及其实现方法:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41594698/article/details/94459513