javaee论坛

普通会员

225648

帖子

335

回复

349

积分

楼主
发表于 2019-11-08 13:35:30 | 查看: 64 | 回复: 2

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

7.2字符串对象7.2.1底层所使用的编码方式

int、raw、embstr

int:对应的数据结构为long类型的整数例子:setnumber10086raw:对应的数据结构为简单动态字符串例子:setstory“Long,longagotherelivedaking…”embstr:对应的数据结构为embstr编码的简单动态字符串,专门用来保存短字符串的一种优化编码方式与raw对比:都会使用redisObject结构和sdshdr结构来表示字符串对象,但raw会调用两次内存分配函数来分别创建这两个结构,而embstr则通过一次来分配一块连续的空间,空间依次包含redisObject和sdshdr

比之raw的好处:内存分配/释放函数次数更少、更好地利用缓存例子:setmsg“hello”

注意:关于longdouble类型表示的浮点数

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

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

总结:字符串对象保存各类型值的编码7.2.2从一种编码转化到另一种编码所需的条件

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

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

因为字符串键的值对字符串对象,所以相应的命令都是针对字符串对象来构建的,如下是部分命令及其实现方法:

7.3列表对象7.3.1底层所使用的编码方式

ziplist、linkedlist

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

例子:RPUSHnumbers1”three“5

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

例子:RPUSHnumbers1”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:对应的数据结构为压缩链表

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

例子:HSETprofilename”Tom“HSETprofileage”25“HSETprofilecareer”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:对应的数据结构为整数集合

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

例子:SADDnumbers135

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

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

例子:SADDDfruits“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:对应的数据结构为压缩列表

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

例子:ZADDprice8.5apple5.0banana6.0cherry

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

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

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

例子:ZADDprice8.5apple5.0banana6.0cherry;命令同上

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

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

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

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

有序集合键的值为哈希对象,所以用于有序集合键的命令都是针对哈希对象来构建的,以下为部分命令及其实现方法:


普通会员

0

帖子

324

回复

333

积分
沙发
发表于 2019-11-19 01:04:50

楼主节操掉了,还不快捡起来

普通会员

0

帖子

342

回复

346

积分
板凳
发表于 2023-12-14 11:31:06

我最喜欢回复人少的贴子了,如果贴子沉了,我就会觉得是自己弄沉的,非常有成就感!如果贴子火了,那我有占了前排,这简直是稳赚不赔的生意嘛

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017