游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

redislist底层数据结构(zipList)

  redislist底层数据结构
  前面学习解了redis的简单字符串sds的结构。这次来学习下List的底层数据结构总概
  Redis中list底层实现有三种linkedListzipListquickListlinkedList
  与java中的linkedList类似。定义链表节点的结构体typedfstructlistNode{前一个节点structlistNodeprev;后一个节点structlistNodenext;当前节点的值的指针voidvalue;}listNode;链表结构typedfstructlist{头指针,即指向链表头部节点listNodehead;尾指针,指向尾部节点listNodetail;节点拷贝函数void(dup)(voidptr);释放节点函数void(free)(voidptr);判断两个节点是否相等的函数int(match)(voidptr,voidkey);链表长度unsignedlonglen;}zipListzipList的数据结构typedfstructziplistT{压缩列表占用字符数int32zlbytes;最后一个元素距离起始位置的偏移量,用于快速定位最后一个节点通过这个参数可以支持双向访问int32zltailoffset;元素个数int16zllength;元素内容T〔〕entries;结束位0xFFint8zlend;}ziplist;entrytypedestructentry{前一个entry的长度intvarprelen;元素类型编码intvarencoding;元素内容optionalbyte〔〕content;}entry;
  entry解析:
  prelen保存的是前一个entry节点的长度,这样在倒序遍历时就可以通过这个参数定位到上一个entry的位置。encoding保存了content的编码类型。content则是保存的元素内容,它是optional类型的,表示这个字段是可选的。当content是很小的整数时,它会内联到content字段的尾部。entry结构的示意图如下所示:
  zipList遍历时,先根据zlbytes和zltailoffset定位到最后一个entry的位置,然后再根据最后一个entry里的prelen时确定前一个entry的位置。zipList的连锁更新
  entry中prelen字段,它的长度要么是1个字节,要么都是5个字节:前一个节点的长度小于254个字节,则prelen长度为1字节;前一个节点的长度大于254字节,则prelen长度为5字节;
  假设现在有一组压缩列表,长度都在250253字节之间,突然新增一个entry节点,这个entry节点长度大于等于254字节。由于新的entry节点大于等于254字节,这个entry节点的prelen为5个字节,随后会导致其余的所有entry节点的prelen增大为5字节。
  同样地,删除操作也会导致出现连锁更新这种情况,假设在某一时刻,插入一个长度大于等于254个字节的entry节点,同时删除其后面的一个长度小于254个字节的entry节点,由于小于254的entry节点的删除,大于等于254个字节的entry节点将会与后面小于254个字节的entry节点相连,此时就与新增一个长度大于等于254个字节的entry节点时的情况一样,将会发生连续更新。发生连续更新时,Redis需要不断地对压缩列表进行内存分配工作,直到结束。linkedList和zipList对比zipList相比于linkedList,其少了pre和next两个指针。在Redis中,pre和next指针就要占用16个字节(64位系统的一个指针就是8个字节)。另外,linkedList的每个节点的内存都是单独分配,加剧内存的碎片化,影响内存的管理效率。与之相对的是,zipList是由连续的内存组成的,这样一来,由于内存是连续的,就减少了许多内存碎片和指针的内存占用,进而节约了内存。linkedList便于在表的两端进行push和pop操作,在插入节点上复杂度很低,但是它的内存开销比较大。zipList存储在一块连续的内存上,所以存储效率很高。但是它不利于修改操作,插入和删除操作需要频繁地申请和释放内存。
  因此当列表对象中元素的长度较小或者数量较少时,通常采用zipList来存储;当列表中元素的长度较大或者数量比较多的时候,则会转而使用双向链表linkedList来存储。quickList
  Redis3。2版本之后,list的底层实现方式又多了一种,quickList。qucikList是由zipList和双向链表linkedList组成的混合体。它将linkedList按段切分,每一段使用zipList来紧凑存储,多个zipList之间使用双向指针串接起来。示意图如下所示:
  typedfstructquicklistNode{前一个节点quicklistNodeprev;后一个节点quicklistNodenext;压缩列表ziplistzl;ziplist大小int32size;ziplist中元素数量int16count;编码形式存储ziplist还是进行LZF压缩储存的zipListint2encoding;。。。}quickListNode;typedfstructquicklist{指向头结点quicklistNodehead;指向尾节点quicklistNodetail;元素总数longcount;quicklistNode节点的个数intnodes;压缩算法深度intcompressDepth;。。。}quickList;quckList中zipList大小
  打开redis。conf文件了。在DVANCEDCONFIG下面有着清晰的记载。Listsarealsoencodedinaspecialwaytosavealotofspace。Thenumberofentriesallowedperinternallistnodecanbespecifiedasafixedmaximumsizeoramaximumnumberofelements。Forafixedmaximumsize,use5through1,meaning:5:maxsize:64Kbnotrecommendedfornormalworkloads4:maxsize:32Kbnotrecommended3:maxsize:16Kbprobablynotrecommended2:maxsize:8Kbgood1:maxsize:4KbgoodPositivenumbersmeanstoreuptoexactlythatnumberofelementsperlistnode。Thehighestperformingoptionisusually2(8Kbsize)or1(4Kbsize),butifyourusecaseisunique,adjustthesettingsasnecessary。listmaxziplistsize2
  quickList内部默认单个zipList长度为8k字节,即listmaxziplistsize的值设置为2,超出了这个阈值,就会重新生成一个zipList来存储数据。根据注释可知,性能最好的时候就是就是listmaxziplistsize为1和2,即分别是4kb和8kb的时候,当然,这个值也可以被设置为正数,当listmaxziplistszie为正数n时,表示每个quickList节点上的zipList最多包含n个数据项。压缩深度
  quickList中可以使用压缩算法对zipList进行进一步的压缩,这个算法就是LZF算法,这是一种无损压缩算法,具体可以参考这里。使用压缩算法对zipList进行压缩后,zipList的结构如下所示:typedfstructziplistcompressed{元素个数int32size;元素内容byte〔〕compresseddata}
  在redis。conf文件中的DVANCEDCONFIG下面也可以对压缩深度进行配置。Listsmayalsobecompressed。Compressdepthisthenumberofquicklistziplistnodesfromeachsideofthelisttoexcludefromcompression。Theheadandtailofthelistarealwaysuncompressedforfastpushpopoperations。Settingsare:0:disablealllistcompression1:depth1meansdontstartcompressinguntilafter1nodeintothelist,goingfromeithertheheadortailSo:〔head〕nodenode。。。node〔tail〕〔head〕,〔tail〕willalwaysbeuncompressed;innernodeswillcompress。2:〔head〕〔next〕nodenode。。。node〔prev〕〔tail〕2heremeans:dontcompressheadorheadnextortailprevortail,butcompressallnodesbetweenthem。3:〔head〕〔next〕〔next〕nodenode。。。node〔prev〕〔prev〕〔tail〕etc。listcompressdepth0
  listcompressdepth这个参数表示一个quickList两端不被压缩的节点个数。需要注意的是,这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。quickList默认的压缩深度为0,也就是不开启压缩当listcompressdepth为1,表示quickList的两端各有1个节点不进行压缩,中间结点进行压缩;当listcompressdepth为2,表示quickList的首尾2个节点不进行压缩,中间结点进行压缩;以此类推小结
  封面图侵权删

售价999元起华为畅享20e正式发布日前,华为畅享20e正式发布。华为畅享系列手机自诞生以来,持续获得消费者的认可,延续了畅享系列优秀产品基因的华为畅享20e再度归来。华为畅享20e本次为用户带来6。3英寸高清大……宴会厅多功能厅安装音响系统大概要多少钱声拓电子音爵士一、扩声系统:音箱:指可将音频信号变换为声音的一种设备。根据会场的面积大小和布局不同,数量及音箱规格选取不同。如:60150平米会议室,可选用4只80W小音箱或2只150……让女人超感动的100句温柔浪漫语下89。妳就是我最困难时的那位永远支持我的人!90。妳可知我百年的孤寂只为妳一人守候千夜的恋歌只为妳一人而唱91。白昼与黑夜将无法阻挡我俩的深深思念!92。我是……你最讨厌抖音里哪个网红?最近不知道怎么回事,抖音里多出来一堆牛鬼蛇神,以前在抖音从来没听说过,我也是从17年就开始玩了,也算是老用户了吧,真的是从来没见过这一批人。我最讨厌的就是那个晚上小时榜第一,舞……海尔卫玺智能马桶盖X3M18U1测评功能旗舰,安全智能智能马桶盖:国货崛起曾几何时,国人还在国外抢购马桶盖,现如今国内的智能马桶盖已经非常成熟,在智能联动和性价比上也有明显优势。今天Messi测评的这款是由海尔与京东联……常州移动提升电梯地下室网络覆盖,为群众办实事解难事做好事实现7万部电梯、2500个地下室4G5G信号覆盖,是今年江苏省政府52件民生实事之一。常州移动专门成立了特殊场景民生工程专项攻坚小组来办好这件民生实事,努力让常州市民有更多获得……OPPO在ChinaJoy上搭建个超玩岛,EVA系列领衔Io往年在ChinaJoy上,我们最熟悉的或许就是ShowGirl和各种游戏展台,不过从去年开始,手机厂商也陆续加入了CJ的行列。比如OPPO,去年我们看到了OPPOReno系列的……我是如何差点中百万大奖的我在十几年前差点中了一百多万,那时看了一本书,好像是国外有个人写的一本书,名字叫幸运法则,具体讲的是如何增加自己的幸运去中奖,我便按书中的方法去锻炼,训练过程有下列几条,一、首……vivoTWS2体验评测弯道超车?还是自动档的各家真无线蓝牙在前两年算是完成的基础布局,想做真无线的都已经开始做了,没做的之后可能也不会做所以到现在你会发现有特别多厂商陆续推出新款TWS耳机,而vivo算是一个让我特别期待……首发天玑1200处理器,realme真我GTNeo评测在realme真我GT发布会后有一个OneMoreThing,那就是本次评测的主角realme真我GTNeo。从当时发布会上的海报来看,能隐隐约约看到有个1200的标致,其实很……这才是1000XM3的完全体!索尼WH1000XM4评测如果你问我上手索尼WH1000XM4的第一直观感受是什么?我的答案是:戴久了没那么热了!相信用过WH1000XM3的小伙伴都深有体会,WH1000XM4在这方面确实改善了许多;……创维汽车真来了续航600km加速7。9S,对标小鹏G3威马E今年4月20日,我们曾跟大家聊过创维造车这件事。当时,创维汽车还没正式官宣,只知道旗下首款车型源自天美ET5换标。很多人还很惊讶:造车这么简单的吗?天美换个标创维汽车?4……
驶入算力时代,车企开启军备竞赛一场围绕自动驾驶展开的权力游戏正在拉开大幕。文Toretto过去的百年时间里,马力让全球的城市与工业疯狂生长。即便在如今电动汽车崛起的时代,人们仍旧习惯用马力来表达……今年过年不回家翻看老照片全家福里美好的回忆找到回家的感觉什么是家,不同的人,处在不同成长时期、不同环境对家的定义和认识是不同的。小时候,父母在哪里家就在哪里,这是小家,父母的父母在哪里,那里就是两个大家。妈妈四兄妹和姥姥……VIVO全新OriginOS有多能打,几点感受与剖析交互体验与设计理念当VIVO全新系统OriginOS刚一出来的时候,相信大多数关注的人以及VIVO粉丝们都会有眼前一亮的感觉,一定会被其清新的桌面风格以及每个功能点所传达……家里盖的4层别墅现在成街坊的笑话房子是前年盖的,村里很多在自己地里盖新房子,有几家已经有五层高了。后来公公和老公商量着建个四层楼,成果预算不行,把装修的钱都花上了,真是无语了。一楼,都没有装修,地上就是……矿视界译文Chia加入开放计算项目,助推存储循环经济8月30日,Chia官方宣布加入开放计算项目(OpenComputeProject),为存储的可持续性做出贡献。开放计算项目以运营Facebook和Microsoft等超……2张A4纸轻薄的手机壳,不烫不重,听说还能防弹?最早的电脑重30t,有好几个房间那么大,早前的手机是块砖头,大哥大重量来说话。3C数码厂商们全部朝着轻薄前进,但是它却很轻易抹杀了所有手机厂商的努力。有人曾经……中国山寨机三巨头,一个比一个会抄,90后机友基本都用过对于80后、90后机友而言,山寨机这个词仿佛还是昨天。中国机圈刚起步那几年,国内许多人基本都用过山寨机。以至于,国内诞生了一个比一个会抄的山寨机品牌巨头企业。不过,随着小……14。58万起售,新款红旗H5正式上市,升级全新3。0智能网日前,我们从一汽红旗官方获悉,2022款红旗H5正式上市,新车共推出6款车型,价格区间为14。5819。08万元,作为年度改款车型,新车的整体变化并不大,主要针对外观细节和配置……快来看看你家的房子会不会被收税了?为积极稳妥推进房地产税立法与改革,引导住房合理消费和土地资源节约集约利用,促进房地产市场平稳健康发展,第十三届全国人民代表大会常务委员会第三十一次会议决定:授权国务院在部分地区……炒菜不再手忙脚乱地按开关,云米cross2X1烟灶套装大家好,我是手撕鲈鱼。我家的抽油烟机和燃气灶还是8年前交房时开发商赠送的,用了这么多年,加上我们一直也没咋清理现在抽油烟机基本不咋抽油烟了,加上我妈时不时就忘记关火,烧干……中国移动将在人机交互类脑计算等方面加强技术攻关中国移动副总经理高同庆27日在2021世界互联网大会乌镇峰会人工智能分论坛介绍,中国移动将加大人工智能领域的基础研究和关键技术攻关。高同庆介绍,中国移动将在智能计算、人机……国产新能源汽车出海,要靠什么才能吃下欧洲市场这块巨大的奶酪?在相当长的一段时间中,国内汽车厂商想打开海外市场,更多需要依靠投资收购、合资等手段,很难将自己的产品出口到国外。曾几何时,最轰动的国产汽车出海新闻,可能要属土豪花费3万美……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网