知名企业网站规划书无锡网站推广哪家公司好
web/
2025/9/29 14:16:18/
文章来源:
知名企业网站规划书,无锡网站推广哪家公司好,有哪些做买家秀的网站,网站建设窗口框架1、简介Redis的五大数据类型也称五大数据对象#xff1b;前面介绍过6大数据结构#xff0c;Redis并没有直接使用这些结构来实现键值对数据库#xff0c;而是使用这些结构构建了一个对象系统redisObject#xff1b;这个对象系统包含了五大数据对象#xff0c;字符串对象(st…1、简介Redis的五大数据类型也称五大数据对象前面介绍过6大数据结构Redis并没有直接使用这些结构来实现键值对数据库而是使用这些结构构建了一个对象系统redisObject这个对象系统包含了五大数据对象字符串对象(string)、列表对象(list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset)而这五大对象的底层数据编码可以用命令OBJECT ENCODING来进行查看。redisObject结构1 typedef structredisObject {2 //类型3 unsigned type:4;4 //编码5 unsigned encoding:4;6 //指向底层实现数据结构的指针7 void *ptr;8 //...9 } robj;redis是以键值对存储数据的所以对象又分为键对象和值对象即存储一个key-value键值对会创建两个对象键对象和值对象。键对象总是一个字符串对象而值对象可以是五大对象中的任意一种。type属性存储的是对象的类型也就是我们说的 string、list、hash、set、zset中的一种可以使用命令 TYPE key 来查看。encoding属性记录了队形所使用的编码即这个对象底层使用哪种数据结构实现。表中列出了底层编码常量及对应的OBJECT ENCODING 命令的输出前三项都是字符串结构我们在存入key-value键值对时并不会指定对象的encoding而是Redis会根据不统的使用场景来为一个对象设置不同的编码可以达到节约内存、加快访问速度等目的。2、字符串对象(string)字符串对象底层数据结构实现为简单动态字符串(SDS)和直接存储但其编码方式可以是int、raw或者embstr区别在于内存结构的不同。(1)int编码字符串保存的是整数值并且这个正式可以用long类型来表示那么其就会直接保存在redisObject的ptr属性里并将编码设置为int如图(2)raw编码字符串保存的大于32字节的字符串值则使用简单动态字符串(SDS)结构并将编码设置为raw此时内存结构与SDS结构一致内存分配次数为两次创建redisObject对象和sdshdr结构如图(3)embstr编码字符串保存的小于等于32字节的字符串值使用的也是简单的动态字符串(SDS结构)但是内存结构做了优化用于保存顿消的字符串内存分配也只需要一次就可完成分配一块连续的空间即可如图字符串对象总结在Redis中存储long、double类型的浮点数是先转换为字符串再进行存储的。raw与embstr编码效果是相同的不同在于内存分配与释放raw两次embstr一次。embstr内存块连续能更好的利用缓存在来的优势int编码和embstr编码如果做追加字符串等操作满足条件下会被转换为raw编码embstr编码的对象是只读的一旦修改会先转码到raw。3、列表对象(list)列表对象的编码可以是ziplist和linkedlist之一。(1) ziplist编码ziplist编码的哈希随想底层实现是压缩列表每个压缩里列表节点保存了一个列表元素。(2)linkedlist编码linkedlist编码底层采用双端链表实现每个双端链表节点都保存了一个字符串对象在每个字符串对象内保存了一个列表元素。列表对象编码转换列表对象使用ziplist编码需要满足两个条件一是所有字符串长度都小于64字节二是元素数量小于512不满足任意一个都会使用linkedlist编码。两个条件的数字可以在Redis的配置文件中修改list-max-ziplist-value选项和list-max-ziplist-entries选项。图中StringObject就是上一节讲到的字符串对象字符串对象是唯一个在五大对象中作为嵌套对象使用的。4、哈希对象(hash)哈希对象的编码可以是ziplist和hashtable之一。(1)ziplist编码ziplist编码的哈希对象底层实现是压缩列表在ziplist编码的哈希对象中key-value键值对是以紧密相连的方式放入压缩链表的先把key放入表尾再放入value键值对总是向表尾添加。(2)hashtable编码hashtable编码的哈希对象底层实现是字典哈希对象中的每个key-value对都使用一个字典键值对来保存。字典键值对即是字典的键和值都是字符串对象字典的键保存key-value的key字典的值保存key-value的value。哈希对象编码转换哈希对象使用ziplist编码需要满足两个条件一是所有键值对的键和值的字符串长度都小于64字节二是键值对数量小于512个不满足任意一个都使用hashtable编码。以上两个条件可以在Reids配置文件中修改hash-max-ziplist-value选项和hash-max-ziplist-entries选项。5、集合对象(set)集合对象的编码可以是intset和hashtable之一。(1)intset编码intset编码的集合对象底层实现是整数集合所有元素都保存在整数集合中。(2)hashtable编码hashtable编码的集合对象底层实现是字典字典的每个键都是一个字符串对象保存一个集合元素不同的是字典的值都是NULL可以参考java中的hashset结构。集合对象编码转换集合对象使用intset编码需要满足两个条件一是所有元素都是整数值二是元素个数小于等于512个不满足任意一条都将使用hashtable编码。以上第二个条件可以在Redis配置文件中修改et-max-intset-entries选项。6、有序集合对象(zset)有序集合的编码可以是ziplist和skiplist之一。(1)ziplist编码ziplist编码的有序集合对象底层实现是压缩列表其结构与哈希对象类似不同的是两个紧密相连的压缩列表节点第一个保存元素的成员第二个保存元素的分值而且分值小的靠近表头大的靠近表尾。(2)skiplist编码skiplist编码的有序集合对象底层实现是跳跃表和字典两种每个跳跃表节点都保存一个集合元素并按分值从小到大排列节点的object属性保存了元素的成员score属性保存分值字典的每个键值对保存一个集合元素字典的键保存元素的成员字典的值保存分值。为何skiplist编码要同时使用跳跃表和字典实现跳跃表优点是有序但是查询分值复杂度为O(logn)字典查询分值复杂度为O(1) 但是无序所以结合连个结构的有点进行实现。虽然采用两个结构但是集合的元素成员和分值是共享的两种结构通过指针指向同一地址不会浪费内存。有序集合编码转换有序集合对象使用ziplist编码需要满足两个条件一是所有元素长度小于64字节二是元素个数小于128个不满足任意一条件将使用skiplist编码。以上两个条件可以在Redis配置文件中修改zset-max-ziplist-entries选项和zset-max-ziplist-value选项。7、总结在Redis的五大数据对象中string对象是唯一个可以被其他四种数据对象作为内嵌对象的列表(list)、哈希(hash)、集合(set)、有序集合(zset)底层实现都用到了压缩列表结构并且使用压缩列表结构的条件都是在元素个数比较少、字节长度较短的情况下四种数据对象使用压缩列表的优点(1)节约内存减少内存开销Redis是内存型数据库所以一定情况下减少内存开销是非常有必要的。(2)减少内存碎片压缩列表的内存块是连续的并分配内存的次数一次即可。(3)压缩列表的新增、删除、查找操作的平均时间复杂度是O(N)在N再一定的范围内这个时间几乎是可以忽略的并且N的上限值是可以配置的。(4)四种数据对象都有两种编码结构灵活性增加。参考《Redis设计与实现》黄健宏著网上对Redis的详解等此博客为笔者使用redis很久之后参考网络上各类文章总结性书写原创手打如有错误欢迎指正。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83932.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!