当前位置: 首页 > news >正文 网页设计 做网站的代码长春做网站优化 news 2025/11/6 1:44:01 网页设计 做网站的代码,长春做网站优化,高端的网站建设怎么做,一级a做爰片免费网站国产Redis原理篇 1、原理篇-Redis数据结构 1.1 Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串#xff0c;因为C语言字符串存…Redis原理篇 1、原理篇-Redis数据结构 1.1 Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串因为C语言字符串存在很多问题 获取字符串长度的需要通过运算非二进制安全不能包含‘\0’字符不可修改不能进程扩容 Redis构建了一种新的字符串结构称为简单动态字符串Simple Dynamic String简称SDS。例如我们执行命令 那么Redis将在底层创建两个SDS其中一个是包含“name”的SDS另一个是包含“虎哥”的SDS。 Redis是C语言实现的其中SDS是一个结构体源码如下 例如一个包含字符串“name”的sds结构如下 SDS之所以叫做动态字符串是因为它具备动态扩容的能力例如一个内容为“hi”的SDS 假如我们要给SDS追加一段字符串“,Amy”这里首先会申请新内存空间 当判断缓冲区内存大小不够用的时候会进行扩容 如果新字符串小于1M则新空间为扩展后字符串长度的两倍 如果新字符串大于1M则新空间为扩展后字符串长度1M。 称为内存预分配。 申请内存的操作非常消耗资源所以可以提升性能。 1.2 Redis数据结构-intset整数数组 IntSet是Redis中set集合的一种实现方式基于整数数组来实现并且具备长度可变、有序等特征。结构如下 其中的encoding包含三种模式表示存储的整数大小不同 为了方便查找Redis会将intset中所有的整数按照升序依次保存在contents数组中结构如图 现在数组中每个数字都在int16_t的范围内因此采用的编码方式是INTSET_ENC_INT16每部分占用的字节大小为encoding4字节length4字节 contents2字节 * 3 6字节 整数集合的升级操作 我们向该其中添加一个数字50000这个数字超出了int16_t的范围intset会自动升级编码方式到合适的大小。以当前案例来说流程如下 升级编码为INTSET_ENC_INT32, 每个整数占4字节并按照新的编码方式及元素个数扩容数组倒序依次将数组中的元素拷贝到扩容后的正确位置将待添加的元素放入数组末尾最后将inset的encoding属性改为INTSET_ENC_INT32将length属性改为4 源码如下 小总结 Intset可以看做是特殊的整数数组具备一些特点 Redis会确保Intset中的元素唯一、有序具备类型升级机制可以节省内存空间底层采用二分查找方式来查询 1.3 Redis数据结构-Dict哈希表 键值对在数据库中就是使用哈希表来存储的 我们知道Redis是一个键值型Key-Value Pair的数据库我们可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。Dict由三部分组成分别是哈希表DictHashTable、哈希节点DictEntry、字典Dict 当我们向Dict添加键值对时Redis首先根据key计算出hash值h然后利用 h sizemask来计算元素应该存储到数组中的哪个索引位置。我们存储k1v1假设k1的哈希值h 1则13 1因此k1v1要存储到数组角标1位置。 Dict由三部分组成分别是哈希表DictHashTable、哈希节点DictEntry、字典Dict Dict的rehash触发的条件 Dict中的HashTable就是数组结合单向链表的实现当集合中元素较多时必然导致哈希冲突增多链表过长则查询效率会大大降低。 Dict在每次新增键值对时都会检查负载因子LoadFactor used/size 满足以下两种情况时会触发哈希表扩容 size是数组的大小uesd是总共的元素 Dict的rehash 不管是扩容还是收缩必定会创建新的哈希表导致哈希表的size和sizemask变化而key的查询与sizemask有关。因此必须对哈希表中的每一个key重新计算索引插入新的哈希表这个过程称为rehash。过程是这样的 计算新hash表的realeSize值取决于当前要做的是扩容还是收缩 如果是扩容则新size为第一个大于等于dict.ht[0].used 1的2^n如果是收缩则新size为第一个大于等于dict.ht[0].used的2^n 不得小于4 这里的rehash是渐进式hash每一次涉及到增删改查到来的时候都进行一次rehash直到所有的数据都迁移完成。 小总结 Dict的结构 类似java的HashTable底层是数组加链表来解决哈希冲突Dict包含两个哈希表ht[0]平常用ht[1]用来rehashrehash包括扩容和收缩 Dict的伸缩 当LoadFactor大于5或者LoadFactor大于1并且没有子进程任务时Dict扩容当LoadFactor小于0.1时Dict收缩扩容大小为第一个大于等于used 1的2^n收缩大小为第一个大于等于used 的2^nDict采用渐进式rehash即每次访问Dict时都会执行一次rehash也就是一次把一个位置上的所有数据进行rehash直到所有的数据都写入这个新的hash表中。rehash时ht[0]只减不增新增操作只在ht[1]执行其它操作在两个哈希表都会执行。 普通双向链表的有点和缺点 1.4 Redis数据结构-ZipList压缩列表 这段话记住 属性类型长度用途zlbytesuint32_t4 字节记录整个压缩列表占用的内存字节数zltailuint32_t4 字节记录压缩列表表尾节点距离压缩列表的起始地址有多少字节通过这个偏移量可以确定表尾节点的地址。zllenuint16_t2 字节记录了压缩列表包含的节点数量。 最大值为UINT16_MAX 65534如果超过这个值此处会记录为65535但节点的真实数量需要遍历整个压缩列表才能计算得出。entry列表节点不定压缩列表包含的各个节点节点的长度由节点保存的内容决定。zlenduint8_t1 字节特殊值 0xFF 十进制 255 用于标记压缩列表的末端。 ZipListEntry ZipList 中的Entry并不像普通链表那样记录前后节点的指针因为记录两个指针要占用16个字节浪费内存。而是采用了下面的结构 previous_entry_length前一节点的长度占1个或5个字节。 如果前一节点的长度小于254字节则采用1个字节来保存这个长度值如果前一节点的长度大于254字节则采用5个字节来保存这个长度值第一个字节为0xfe后四个字节才是真实长度数据 encoding编码属性记录content的数据类型字符串还是整数以及长度占用1个、2个或5个字节contents负责保存节点的数据可以是字符串或整数 所以使用这种方式在本节点就知道前一个结点的长度这样就能根据自己的地址找到前一个结点的地址实现逆序遍历。 ZipList中所有存储长度的数值均采用小端字节序即低位字节在前高位字节在后。例如数值0x1234采用小端字节序后实际存储值为0x3412 Encoding编码 ZipListEntry中的encoding编码分为字符串和整数两种字符串如果encoding是以“00”、“01”或者“10”开头则证明content是字符串编码的后面几位可以标识字符串内容的大小 编码编码长度字符串大小00pppppp01ppppppqqqqqqqq10000000qqqqqqqq 例如我们要保存字符串“ab”和 “bc” encoding能体现编码类型和长度后面的就是contents使用的是ASC码来表示的。 前面的三部分都是使用了小端方式 ZipListEntry中的encoding编码分为字符串和整数两种 整数如果encoding是以“11”开始则证明content是整数且encoding固定只占用1个字节 编码编码长度整数类型110000001int16_t2 bytes110100001int32_t4 bytes111000001int64_t8 bytes11110000124位有符整数(3 bytes)1111111018位有符整数(1 bytes)1111xxxx1直接在xxxx位置保存数值范围从0001~1101减1后结果为实际值 整个结构 ZipList的缺点只能从前向后或者从后向前遍历如果节点在中间且节点比较多则比较耗费时间。 1.5 Redis数据结构-ZipList的连锁更新问题 但是如果现在有个元素加入到队头并且大小占用超过了254字节所以后面的一个结点的记录上一个节点的长度就会改变然后后面连续的都会改变。 ZipList这种特殊情况下产生的连续多次空间扩展操作称之为连锁更新Cascade Update。新增、删除都可能导致连锁更新的发生。 小总结 ZipList特性 ZipList劣势不能数据过多因为找到一大块连续内存是比较困难的所以引入了QuickList 1.6 Redis数据结构-QuickList快速链表 为了解决一次申请较大的内存空间比较困难以及连续更新的问题引入了快速链表就是双向链表压缩链表的形式。 问题1ZipList虽然节省内存但申请内存必须是连续空间如果内存占用较多申请内存效率很低。怎么办 答为了缓解这个问题我们必须限制ZipList的长度和entry大小。 问题2但是我们要存储大量数据超出了ZipList最佳的上限该怎么办 答我们可以创建多个ZipList来分片存储数据。 问题3数据拆分后比较分散不方便管理和查找这多个ZipList如何建立联系 答Redis在3.2版本引入了新的数据结构QuickList它是一个双端链表只不过链表中的每个节点都是一个ZipList。 为了避免QuickList中的每个ZipList中entry过多Redis提供了一个配置项list-max-ziplist-size来限制。如果值为正则代表ZipList的允许的entry个数的最大值如果值为负则代表ZipList的最大内存大小分5种情况 -1每个ZipList的内存占用不能超过4kb-2每个ZipList的内存占用不能超过8kb-3每个ZipList的内存占用不能超过16kb-4每个ZipList的内存占用不能超过32kb-5每个ZipList的内存占用不能超过64kb 其默认值为 -2 以下是QuickList的和QuickListNode的结构源码 我们接下来用一段流程图来描述当前的这个结构 compress是首位不压缩的数量中间的是压缩的方式 总结 QuickList的特点 是一个节点为ZipList的双端链表 节点采用ZipList解决了传统链表的内存占用问题控制了ZipList大小解决连续内存空间申请效率问题 中间节点可以压缩进一步节省了内存所以QuickList具有链表和ZipList的优点即既可以分散存储连接又可以占用的内存比较少因为ZipList是比较节省空间的 QuickList和ZipList特点就是节省内存不过他们在遍历的时候只能从头遍历或者从尾遍历中间随机查询性能比较低。所以有了下面的跳表 1.7 Redis数据结构-SkipList跳表 SkipList跳表使用的是 链表但与传统链表相比有几点差异 元素按照升序排列使用多级指针存储节点可能包含多个指针指针跨度不同。 查找过程先从第一个节点的最高级指针开始找到下一个节点然后下一个节点和要找的节点的得分如果要找的得分大就继续往后查找如果要找的得分小那就使用下一级的指针类似与二分查找。 小总结 SkipList的特点 跳跃表是一个双向链表每个节点都包含score和ele值节点按照score值排序score值一样则按照ele字典排序每个节点都可以包含多层指针层数是1到32之间的随机数不同层指针到下一个节点的跨度不同层级越高跨度越大增删改查效率与红黑树基本一致lonN实现却更简单 为什么使用跳表而不使用平衡树 1.8 Redis数据结构-listpack 虽然快速链表的出现减少了连续更新来的性能影响但是由于它的设计记录了前一个结点的大小所以说还是会出现这个问题。 因为redis5.0出现了一个listpack的结构来代替压缩链表。也就是说listpack只会记录当前节点的长度这样新增元素的时候不会影响其他结点的长度字段。 结构设计 即从当前节点的地址解析到前一个节点的长度就可以得到前一个结点的地址。 1.9 Redis数据结构-RedisObject Redis中的任意数据类型的键和值都会被封装为一个RedisObject也叫做Redis对象源码如下 这个对象头部就是占用16个字节。 所以如果是String类型每个String都会有一个对象头如果是list那么只需要一个对象头。 Redis的编码方式 Redis中会根据存储的数据类型不同选择不同的编码方式共包含11种不同类型 五种数据结构 Redis中会根据存储的数据类型不同选择不同的编码方式。每种数据类型的使用的编码方式如下 2.0 Redis数据结构-String Stirng类型有三种编码方式其基本编码方式是RAW基于简单动态字符串SDS实现redis对象头中有一个指针指向这个SDS如果存储的SDS长度小于44字节则会采用EMBSTR编码此时对象头与SDS是一段连续空间。****如果⼀个String类型的value的值是数字则会采用INT编码直接保存在redis对象头的ptr位置。 String是Redis中最常见的数据存储类型 其基本编码方式是RAW基于简单动态字符串SDS实现存储上限为512mb。 如果存储的SDS长度小于44字节则会采用EMBSTR编码此时object head与SDS是一段连续空间。申请内存时只需要调用一次内存分配函数效率更高。因为内存切换涉及到内核态和用户态的切换。所以我们使用String的时候最好不要超过44字节 如果⼀个String类型的value的值是数字则会采用INT编码直接保存在redis对象头的ptr位置。 总结三种编码方式 2.1 Redis数据结构-List List结构是由快速链表来实现的。 QuickListLinkedList ZipList可以从双端访问内存占用较低包含多个ZipList存储上限高 Redis的List类型可以从首、尾操作列表中的元素 哪一个数据结构能满足上述特征 LinkedList 普通链表可以从双端访问内存占用较高内存碎片较多ZipList 压缩列表可以从双端访问内存占用低存储上限低QuickListLinkedList ZipList可以从双端访问内存占用较低包含多个ZipList存储上限高 Redis的List结构类似一个双端链表可以从首、尾操作列表中的元素 在3.2版本之前Redis采用ZipList和LinkedList来实现List当元素数量小于512并且元素大小小于64字节时采用ZipList编码超过则采用LinkedList编码。 在3.2版本之后Redis统一采用QuickList来实现List 2.2 Redis数据结构-Set结构 set这个数据类型为了保证查询效率和唯一性采用了哈希表来存储key就是set元素value统一是null。当储存的所有数据都是整数的时候set会采用整数集合Intset来存储以节省内存。 Set是Redis中的单列集合满足下列特点 不保证有序性保证元素唯一求交集、并集、差集 可以看出Set对查询元素的效率要求非常高思考一下什么样的数据结构可以满足 结构如下 2.3、Redis数据结构-ZSET 因为zset是是可以根据key找到score并且可以根据score进行排序的功能所以底层采用的是跳表和哈希表哈希表是用来进行查询可以根据key来找到score跳表可以根据score得分并且能够快速的根据得分查询。性能比较好但是内存占用比较大所以当元素数量不多的时候采用的是压缩列表来存储即达到两个条件分别是元素的数量小于128并且每个元素都小于64字节。 ZSet也就是SortedSet其中每一个元素都需要指定一个score值和member值 可以根据score值排序后member必须唯一可以根据member查询分数 因此zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学习的哪种编码结构可以满足 SkipList可以排序并且可以同时存储score和ele值member但是不能根据键值存储。HTDict可以键值存储并且可以根据key找value 所以Zset使用的是两种结合的方式 性能比较好但是内存占用比较大 ziplist本身没有排序功能而且没有键值对的概念因此需要有zset通过编码实现 ZipList是连续内存因此score和element是紧挨在一起的两个entry element在前score在后score越小越接近队首score越大越接近队尾按照score值升序排列 2.4 、Redis数据结构-Hash Hash结构与Redis中的Zset非常类似 都是键值存储都需求根据键获取值键必须唯一 区别如下 zset的键是member值是scorehash的键和值都是任意值zset要根据score排序hash则无需排序 文章转载自: http://www.morning.rfljb.cn.gov.cn.rfljb.cn http://www.morning.cmqrg.cn.gov.cn.cmqrg.cn http://www.morning.fkwp.cn.gov.cn.fkwp.cn http://www.morning.jgcrr.cn.gov.cn.jgcrr.cn http://www.morning.wmcng.cn.gov.cn.wmcng.cn http://www.morning.ghfmd.cn.gov.cn.ghfmd.cn http://www.morning.bdtpd.cn.gov.cn.bdtpd.cn http://www.morning.twpq.cn.gov.cn.twpq.cn http://www.morning.lbssg.cn.gov.cn.lbssg.cn http://www.morning.wmfmj.cn.gov.cn.wmfmj.cn http://www.morning.bmssj.cn.gov.cn.bmssj.cn http://www.morning.nqgjn.cn.gov.cn.nqgjn.cn http://www.morning.zcsch.cn.gov.cn.zcsch.cn http://www.morning.rbqlw.cn.gov.cn.rbqlw.cn http://www.morning.krfpj.cn.gov.cn.krfpj.cn http://www.morning.nzdks.cn.gov.cn.nzdks.cn http://www.morning.pfntr.cn.gov.cn.pfntr.cn http://www.morning.jzgxp.cn.gov.cn.jzgxp.cn http://www.morning.mwzt.cn.gov.cn.mwzt.cn http://www.morning.rybr.cn.gov.cn.rybr.cn http://www.morning.rywr.cn.gov.cn.rywr.cn http://www.morning.tnhqr.cn.gov.cn.tnhqr.cn http://www.morning.qcygd.cn.gov.cn.qcygd.cn http://www.morning.rywr.cn.gov.cn.rywr.cn http://www.morning.kqxwm.cn.gov.cn.kqxwm.cn http://www.morning.rzmzm.cn.gov.cn.rzmzm.cn http://www.morning.rkrl.cn.gov.cn.rkrl.cn http://www.morning.xrhst.cn.gov.cn.xrhst.cn http://www.morning.ybgyz.cn.gov.cn.ybgyz.cn http://www.morning.pghgq.cn.gov.cn.pghgq.cn http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn http://www.morning.cklld.cn.gov.cn.cklld.cn http://www.morning.shuanga.com.cn.gov.cn.shuanga.com.cn http://www.morning.lxjcr.cn.gov.cn.lxjcr.cn http://www.morning.mngyb.cn.gov.cn.mngyb.cn http://www.morning.lbcfj.cn.gov.cn.lbcfj.cn http://www.morning.pgggs.cn.gov.cn.pgggs.cn http://www.morning.rkqqf.cn.gov.cn.rkqqf.cn http://www.morning.sjsfw.cn.gov.cn.sjsfw.cn http://www.morning.zyslyq.cn.gov.cn.zyslyq.cn http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.dtmjn.cn.gov.cn.dtmjn.cn http://www.morning.sjqpm.cn.gov.cn.sjqpm.cn http://www.morning.dhqg.cn.gov.cn.dhqg.cn http://www.morning.mbpfk.cn.gov.cn.mbpfk.cn http://www.morning.rzczl.cn.gov.cn.rzczl.cn http://www.morning.qpsxz.cn.gov.cn.qpsxz.cn http://www.morning.zzbwjy.cn.gov.cn.zzbwjy.cn http://www.morning.sgnjg.cn.gov.cn.sgnjg.cn http://www.morning.nykzl.cn.gov.cn.nykzl.cn http://www.morning.fpzz1.cn.gov.cn.fpzz1.cn http://www.morning.qichetc.com.gov.cn.qichetc.com http://www.morning.glxdk.cn.gov.cn.glxdk.cn http://www.morning.jntdf.cn.gov.cn.jntdf.cn http://www.morning.mghgl.cn.gov.cn.mghgl.cn http://www.morning.pwzzk.cn.gov.cn.pwzzk.cn http://www.morning.rxyz.cn.gov.cn.rxyz.cn http://www.morning.bpmtr.cn.gov.cn.bpmtr.cn http://www.morning.pqkgb.cn.gov.cn.pqkgb.cn http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn http://www.morning.cgntj.cn.gov.cn.cgntj.cn http://www.morning.wrdpj.cn.gov.cn.wrdpj.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn http://www.morning.yltyr.cn.gov.cn.yltyr.cn http://www.morning.wnhgb.cn.gov.cn.wnhgb.cn http://www.morning.mbpzw.cn.gov.cn.mbpzw.cn http://www.morning.hgwsj.cn.gov.cn.hgwsj.cn http://www.morning.ktblf.cn.gov.cn.ktblf.cn http://www.morning.bynf.cn.gov.cn.bynf.cn http://www.morning.qnwyf.cn.gov.cn.qnwyf.cn http://www.morning.kjrlp.cn.gov.cn.kjrlp.cn http://www.morning.yxplz.cn.gov.cn.yxplz.cn http://www.morning.rtpw.cn.gov.cn.rtpw.cn http://www.morning.bflws.cn.gov.cn.bflws.cn http://www.morning.xdttq.cn.gov.cn.xdttq.cn http://www.morning.tjsxx.cn.gov.cn.tjsxx.cn http://www.morning.mjkqj.cn.gov.cn.mjkqj.cn 查看全文 http://www.tj-hxxt.cn/news/280982.html 相关文章: 网站网格设计云主机推荐 西地那非片能延时多久每次吃多少seo 网站分析 我要做个网站系统开发毕业设计 南京市建设工程交易中心网站芜湖企业网站制作 动画网页制作网站导航网站模板 网站开发框架 c长春网站开发招聘 有实力高端网站设计地址河北邯郸网站建设 做网站创意是什么意思代做网站作业 网站后天添加文章不显示保定专业做网站 中学网站建设工作实施方案温岭市市住房和城乡建设规划局网站 做那个的视频网站wordpress文章发布工具 给网站设置长尾关键词工业和信息化部网站备案系统查询 建设汽车行业网站WordPress付费会员组 合江县住房和城乡规划建设局网站网站建设发布教程视频 常州市建设局网站资质建筑装饰装修工程公司 php网站开发和部署用dw制作视频网站 淘宝网站怎么做网站好看的网页设计作品 网站建设属于什么职位类别大规模301让网站快速排名 接单网站源码网站用的什么数据库 wordpress开发网站wordpress 登录后页面空白页 汽车金融网站怎么做微商引流客源最快的方法 湖州高端网站设计医药网站建设需要注意点 网站制作维护费 归属西安免费信息推广平台 win2003创建网站中国有名的设计公司 高职网站建设专业书合肥效果图制作公司 中国建设银行网站首页怎么销户子域名ip查询大全 陕西省建设厅便民服务网站网站首页怎么做ps 网站建设公司能信吗呼市浩特网站建设外包公司 基于php技术的个人网站设计营销型机械网站 jsp网站开发大作业福田区龙岗区发布通告